5.1
面试题1:
int i=1;
void main()
{
int i=i;
}
main函数里面的i与外面的i无关, i变量从声明的那一刻开始就是可见的了。上述可等价于:
void main()
{
int i;
i=i;
}
因此上述i是一个已经声明,但是未定义值的i。i不等于1
若将上述代码改成:
int c=1;
void main()
{
int i=c;
}
则i=1。
面试题2:
x==(y=z); //这句话是将z赋值给y,并判断x和y是不是相等,不管相不相等,x并未发生变化。所以x还是10。
注意位操作符号:
&:与运算
&&:且//y&&z:如果y为真,z为真,则返回1
|:按位异或
||:或//y||z,如果y和z中有真,则返回1。
面试题3:略。
5.2
面试题1:
A:
for(a=0,x=0;a<=1&&!x;a++)
{
a++;
}
cout<<a<<x<<endl;
B:
for(a=0,x=0;a<=1&&!x)
{
a++;
}
cout<<a<<x<<endl;
以下for循环执行顺序如图1:
for(a; b; c){
d;
}
图1
另外,需要
注意的是:x=0,所以
x的非为1,因此第一次循环符合要求
所以输出:A:21 B:12
面试题2:
printf()函数是从右到做运算。C++编程基本上是
从右到左的运算方式。所以题中的printf("%d,%d\n",*ptr,*(++ptr)); 中两个ptr指向的是同一个元素。
5.4
面试题1:
(int&)a:不经转换,直接a在内存中的单元值,并且以int的方式输出来。
(int)a:将a转换成int。
本题需要了解float在内存中的存储方式:
float存储分两部分:底数部分和指数部分(8位,-126~128)。其中指数部分的值是原指数加上127之后的值。
格式: SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM
上述S:表示正负,E为指数部分,M为底数部分,其中M的最左边省略了1, 所以M实际上应该是:1.MMM MMMM MMMM MMMM MMMM MMMM
例如:-12.5:
首先为负数,所以S=1;12.5对应二进制为1100.1000,底数部分左移3位->1.1001000,最左边1省略,且E=3+127=130,对应十进制:10000010所以最后存储的二进制为1100 0001 0100 1000 0000 0000 0000 0000。 对应16进制:C1480000。
例如:17.625
首先是正数,S=0。17.625对应二进制10001.101,左移4位,->1.0001101,最左边1省略,且E=4+127=131,对应十进制:10000011,所以最后存储的二进制为0100 0001 1000 1101 0000 0000 0000 0000。对应16进制:418D0000。
因此,1.0f在内存中存储的格式是S=0,E=0+127=127,底数部分为0。对应二进制为0011 1111 1000 0000 0000 0000 0000 0000 0000, 对应16进制:3f800000。(int&)a就是1065353216.
0.0f是float中比较特殊的格式,他的指数部分,底数部分均为0。因此对应的(int&)a也是0。
面试题2:
%08x: %x以十六进制输出,08表长度,如果长度不足8,以0补足。
在默认x86,32位系统中,数据以小端存储。也就是说0xFFFF FFF7这个数据的存储方式如下:
当int类型的a复制给char类型时,会发生字节阶段,由于char类型为1个字节,因此,保留第一个内存单元的值,即F7,以%08x的形式输出后,结果为0000 00F7。
char* b=(char*)&a,将a的地址强制转换成char*的形式。由于原先的&a指针,指向的是一个拥有4个字节的内存地址,强制转化成char*后,现在的char指针,只是只想一个拥有1个字节的内存地址,即F7所在的地址。另外,char是一个有符号类型,因此printf后,发生参数提升,输出FFFF FFF7。
如果char* b=(char*)&a 变成 unsigned char* b=(unsignedchar*)&a 则输出的结果就是0000 00F7。
5.5
面试题1:
注意数据在寄存器中存放的格式。 unsigned char a=0xA5,在eax16位寄存器中的表达式是0000 0000 1010 0101, 取反后为1111 1111 0101 1010,右移5位是0000 0111 1111 1010, 由于unsigned char是8位,所以截断最低一个字节得1111 1010,对应的是250。
面试题2: 略。
面试题3:
记住。。。我也不知道为什么 (x+y)/2用程序表示(x&y)+((x^y)>>1)。
面试题4:略。
5.6
面试题1~2: 略。
面试题3: 需要注意数据操作时,是否越界。
5.7
面试题1:extern 解决C到C++中的名字匹配问题。 C++支持函数重载,C不支持。当void foo(int x,int y)在C++中编译后,在库中的名字是_foo_int_int,而在C中是_foo。
面试题2:略。