IT求职知识:基础知识1(c++代码篇)
发表日期:2011-07-05 作者:DH分类:编程技术 标签: c++
又是一个暑假的到来了,虽然现在工作了,已经体验不要暑假的味道了,但是过了这个暑假,很多同学就要准备找工作了。
找工作既是一个自己努力的过程,又是一个考验自己的经历,还有一些不懂得运气。
对于一个it的求职者来说,现在的这个阶段,大家应该在看基础的计算机理论知识。
前段时间有个兄弟问我,你找工作时候的资料,我叫他到墨鱼的博客找,他说很难找,那我就帮他整理一下,希望他能看到,并找到称心的工作。一来可以把一些觉得还有些意思的题分享给大家,同时也给自己做个备忘。
1.宏定义
#define product(x) (x*x)
int main()
{
int i=3, j, k;
j=product(i++);
k=product(++i);
printf("j=%d,k=%d",j,k);
return 0;
}
Answer: 9, 49
Explanation: 注意此处使用的是宏定义,宏定义的展开是简单的替换,所以每次i都会增2.
2. 类型转换
char foo(void)
{
unsigned int a = 6;
int b= -20;
char c;
(a+b>6)?(c=1):(c=0);
return c;
}
Answer: 1
Explanation: 类型转换在int遇到unsigned int是转换为unsigned int。
3. 不适用中间变量的a,b值交换
a=a+b;b=a-b;a=a-b;
a=a^b;b=a^b;a=a^b;
第一种解法不需要解释,但要说明的是有一个缺点就是当a,b很大时会溢出。
关于第二个解法首先要了解异或运算满足交换律和结合律,从这个角度来看解法二可以这么理解:
b = (a^b)^b = a^(b^b) = a^0=a;
a=(a^b)^a = a^(b^a)=a^(a^b)=(a^a)^b = 0^b = b;
4. atexit函数
void fn(void);
int main(void)
{
atexit(fn);
printf("Hi,");
}
void fun(void)
{
printf("Jack!\n");
}
Answer: 输出 Hi, Jack!
Explanation:这个函数可以再main函数执行结束的时候执行指定的过程。很想消息注册的机制。下面给出个简单例子。
注:这是程序员面试宝典37页的例子,dev c++中测试失败。
5. sizeof
char ss2[] = "0123456789";
char ss3[100]="0123456789";
int ss4[100]=;
printf("%d,%d,%d\n",sizeof(ss2),sizeof(ss3),sizeof(ss4));
Answer: 11,100,400
Explanation: 11,100,4*100=400(int的大小是4个字节)
6. 关于虚继承
class A
{
int x;
......
}
class B: public A;
class C: public A;
class D: public B, public C;
对于上述代码类D将拥有两个x成员,B::x和C::x。在很多情况下我们需要把两个x合并成一个,这时候就需要虚基类的帮忙。
class A;
class B:virtual public A;
class C:virtual public A;
class D:public B, public C;
这而有个二义性和优先级的问题需要考虑:
a. 如果在继承路径中最终的子类继承的是同一虚基类的成员,则无二义性
b. 如果在继承路径中某条路径中是虚基类的成员,另一条路径中是派生类的同名成员,则派生类的优先级高于虚基类。
c. 如果每条继承路径中出现非虚基类的同名成员,则有二义性。
例子:
#include
class B
{
public:
void print()
{
std::cout << "B" << std::endl;
}
};
class D1: public virtual B
{
};
class D2: public virtual B
{
public:
void print()
{
std::cout << "D2" << std::endl;
}
};
class DD: public D1, public D2
{
};
int main ()
{
DD d;
d.print();// 注意此处:ok: call D2::print,这是上面分析的第二种情况
return 0;
}
7.从M进制转换为N进制(宝典中的例子有严重错误)
先从简单的例子着手:
(1) M进制转换到十进制
a1a2a3…ak(M) = a1*M^(k-1)+a2*M^(k-2) + … ak*M^0 = a1a2…a(k-1)(M)*M + ak = f(k-1)*M + ak(这一步是递归表达)
(2)十进制转换M进制 仿照上述转换,同样得到
f(Num/M)*10 + Num%M(递归表示)
(3)泛化:任意进制数转换N进制,假设Num/N结果是10进制,Num用自身的进制表示当然对于大于10的进制需要要引入其他符号表示
f(Num/N)*10 + Num%N
简单的例子:
int ToRadix(int num, int toRadix)
{
if(num/toRadix==0)
return num;
else
return ToRadix(num/toRadix, toRadix)*10 + num%toRadix;
}
int main(void)
{
printf("%d\n",ToRadix(0x12,4)); //注意此处的参数表示
return 0;
}
8.地址的类型
float a = 1.0f;
cout << (int)a << endl;
cout << (int&)a << endl;
cout << boolalpha << ( (int)a == (int&)a ) << endl;
float b = 0.0f;
cout << (int)b << endl;
cout << (int&)b << endl;
cout << boolalpha << ( (int)b == (int&)b ) << endl;
Answer: false true
Explanation: (int&)a 和 *((int*)&a)是一样的,把&a这个地址上32位数看作int型
除非注明,文章均为灯火部落原创,转载请注明出处:IT求职知识:基础知识1(c++代码篇)-灯火部落