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

来源:互联网 发布:淘宝网站构架 编辑:程序博客网 时间:2024/06/02 12:54

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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 执行局执行不到钱怎么办 小孩挖耳朵疼了怎么办 挖耳朵挖破了怎么办 挖耳朵皮挖破了耳鸣怎么办 北京自考证丢啦怎么办 不服检察院的答复函该怎么办 检察院控申答复函不复怎么办 在看守所里疯了怎么办 第一次吸毒拘留五天第二次会怎么办 被派出所拘留15天怎么办 老公从拘留所出来聪明老婆怎么办 中信信用卡忘记还款了怎么办 监狱的犯人病了怎么办 判缓期间在行政拘留怎么办 法院拘留15天工作怎么办 高血压签定了无期限合同怎么办 法院司法拘留找不到人怎么办 c1骑摩托车要拘留怎么办 欠钱的找不到人怎么办 治安拘留人跑了怎么办 行政拘留拘留所不收应该怎么办 在看守所被打了怎么办 取保候审超过12个月怎么办 拘留20天还没有判刑怎么办 被打了没有证据怎么办 拘留37天后没有放人怎么办 强制执行执行的财产不够怎么办 收到公安局拘留通知家属应该怎么办 对方不出谅解书怎么办 寻衅滋事没抓的 怎么办 公务员政审父母拘留过怎么办 我参与了网赌怎么办 亲人出车祸去世家属怎么办 车牌换了原保险怎么办 北京车牌夫妻变更车险怎么办 赌博拘留15天不交罚款怎么办 给人打了不赔钱怎么办 打了人对方讹钱怎么办 换车了原来的etc怎么办 换异地车牌了etc怎么办 被执行人拘留15天后不还钱怎么办