第二章总结 C/C++程序设计

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:略。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值