第一题
1. 已知int i=1, j=2;,则表达式i+++j的值为( )
A:1
B:2
C:3
D:4
答案及解析 C
本题考查的是前置++和后置++的优先级,后置++的优先级是高于前置++的,所以这个表达式就可以转变为:(i++) + j
而后置++的返回值是++之前的值,所以结果就为3;
第二题
2. 假定有定义为“ int a[10], x, *pa=a; ”,若要把数组 a 中下标为 3 的元素值赋给 x ,则不正确的赋值为 ( )
A:x=pa[3]
B:x=*(a+3)
C:x=a[3]
D:x=*pa+3
答案及解析 D
A:pa是指向的a数组的首元素地址,所以pa就相当于数组名,pa[3]正确;
B:*(a+3)就是让a指针向后移动3个元素,到下标为3的位置,再解引用,正确;
C:正确;
D:*的优先级高,先解引用pa,取到的是首元素的值,+3就是首元素的值➕3,错误;
第三题
3. 若已定义的函数有返回值,则以下关于该函数调用的叙述中错误的是()
A:函数调用可以作为独立的语句存在
B:函数调用可以作为一个函数的实参
C:函数调用可以出现在表达式中
D:函数调用可以作为一个函数的形参
答案及解析 D
A:函数的调用可以是独立的语句,比如我们实现的函数不需要返回值,只是完成一些特定的操作,如打印,交换,输入等等;
B:函数调用可以作为实参,但是必须有返回值的函数;
C:函数调用可以出现在表达式,也必须有返回值;
D:返回值存在寄存器中,没有地址,不能作为形参,但可以作为实参
第四题
4. 在32位的系统中,下面代码打印结果为()
union package { char head; int body; }; struct message { char id; int crc; union package pack; }; int main() { printf("size=%d\n",sizeof(struct message)); return 0; }
A:9
B:10
C:11
D:12
答案及解析 D
做错的直接来看我的这个博客C/C++内存对齐规则(结构体、联合体、类)-CSDN博客
第五题
5. 32位机器上,以下代码的输出是()
char c = -1; int i0 = c; int i1 = (unsigned char)c; printf("%d, %d\n", i0, i1);
A:255,255
B:-1,-1
C:-1,255
D:255,-1
答案及解析 C
这里考察的是char的取值范围是-127~128
而unsigned char是0~255
所以i0 = c,会有整型提升,也就是原来8个bit位的char类型,会提升位int类型,32的bit,高位补符号位;
11111111 111111111 11111111 11111111
而我们强制类型转换c位unsigned char 也就是不允许负数的存在了,所以-1的符号位,也就是数值位了。11111111就是255
i1 = (unsigned char)c,对于无符号的整型提升,高位补0
00000000 00000000 00000000 11111111
依旧是255;