第一题
1. 下列代码的运行结果()
short i = 65537; int j = i + 1; printf("i=%d,j=%d\n", i, j);
A:i = 65537,j = 65538
B:i = 1,j = 2
C:i = -1,j = 0
D:i = 1,j = 65538
答案及解析 B
本题考查的是隐式类型转换,涉及到整型提升和截断;
65537的二进制位:0001 0000 0000 0000 0001
所以当65537给一个short类型的,一定会发生整型截断,因为65537是int类型的,4字节,32个比特位;而short是2字节,16个比特位;
所以真正是i得到的二进制数位:0000 0000 0000 0001
也就是i = 1
那么j = i + 1;就是普通加法,因为都是int类型,没有隐式类型转换啦;
所以i = 1,j = 2;
第二题
2. 下列程序段运行后x的值是()
int main() { int a = b = c = 0; int x = 35; if (!a) x--; else if (b) ; if (c) x = 3; else x = 4; reutrn 0; }
A:3
B:4
C:35
D:34
答案及解析 B
本题考查的是if-else语句的认识,我们要知道谁跟谁是一个组的;
首先 if 和 else if 为一组,if(c)和else一组
然后 if 的条件判断0为假,非0为真;
! 是逻辑反,真变假,假变真
第三题
3. 下面的结构体的sizeof是多少()
struct T { int iVersion; char cTag; char cAdv; int iUser; char cEnd; };
A:11
B:12
C:13
D:16
答案及解析 D
第四题
4. 下面代码的输出结果是()
int x = 127; int z = 0; short y = -9; z = x + y;
A:x=0000007FH,y=FFF9H,z=00000076H
B:x=0000007FH,y=FFF9H,z=FFFF0076H
C:x=0000007FH,y=FFF7H,z=FFFF0076H
D:x=0000007FH,y=FFF7H,z=00000076H
答案及解析 D
首先答案是用16进制表示的,十进制数末尾用D表示,二进制末尾用B表示,十六进制数末尾用H表示,八进制末尾用O表示。 例如:101B 表示二进制数
之后我们就开始讲解本题:在转换为16进制之前,先算出他们的十进制
首先x肯定就是127,转换为16进制就是7F
y = -9;y是short类型,-9是int类型,会发生隐式类型的转换,一定要用补码!因为只要有关二进制的计算,都是用补码来的;
int--4字节--32比特位,shotr--2字节--16比特位,1比特位 = 1二进制位
-9的二进制 原码:1000....1001
按位取反,符号位不变:反码:1111....0110
加一 补码:1111....0111
32位截断为16位
补码:1111 1111 1111 0111
反码:1000 0000 0000 1000
补码:1000 0000 0000 1001
依旧是-9,所以我们会发现只要int类型数字的二进制,在16位之内是1就没事,截断也不影响大小;
y = -9 ,记住,计算机存的是补码,所以转换为16进制的应该是补码,
也就是:1111 1111 1111 0111 --> FFF7
第五题
5. 下面代码运行结果()
int main() { int a = 7, b = 8, *p, *q, *r; p = &a; q = &b; r = p; p = q; q = r; printf("%d,%d,%d,%d\n", *p, *q, a, b); }
A:8,7,8,7
B:7,8,7,8
C:8,7,7,8
D:7,8,8,7
答案及解析 C
这个题就是要知道,值可以被保存的
p最开始存a的地址,q最开始存b的地址
r = p,也就是 r 也存a的地址
p = q ,p又指向 q ,存的就是b 的地址;
q = r,q 指向 r ,q 存的就是 a 的地址;
所以现在就是 p存b地址,q存a地址,完成了交换