C/C++练习题解析(一)

[Question]

有如下程序段:

char ch=-1;
printf(“%02x,%02x”,ch,(unsigned char)ch);

则输出:

[A] -1,-1

[B] ff,ff

[C]ffffffff,ff

[D]ff,ffffffff 


[Answer]

关于输出的知识点:

%c读入一个字符  

%d 读入十进制整数    

%o读入八进制整数  

%x 读入十六进制整数  

%s读入一个字符串,遇空格、制表符或换行符结束。  

%p读入一个指针  

%u读入一个无符号十进制整数 

本题的%02x,%x是指输出十六进制整数,2是指至少输出2位,0是指不足位用0填充。

关于符号扩展:

短数据类型扩展为长数据类型:
ch:要扩展的数据类型为有符号类型,用短数据的符号位填充长数据多出来的高字节 ,-1 (11111111)扩展为int,符号位为1, 因此得到11111111 11111111 11111111 11111111(ffffffff)
(unsigned char)ch:先把ch转换位无符号整数,-1(11111111)->255,此时符号位为0,因此得到00000000 00000000 00000000 11111111(ff)

[Question]
广义表L=(a,(b,c)),进行Tail(L)操作后的结果为()。
[A] c
[B] ((b,c))
[C] b,c
[D] (b,c)
[Answer]广义表即链表,L长度为2,原子a和子表(b,c),一个广义表的尾表始终是一个广义表,其中B是一个只包含子表(b,c)的广义表,符合要求。

[Question]
下面程序段的输出结果是
char *p1 = ”123”, *p2 = ”ABC”, str[50] = “xyz”;
strcpy(str + 2, strcat(p1, p2));
printr(“s\n”, str);
[A] xyz123ABC
[B] z123ABC
[C] xy123ABC
[D] 出错
[Answer]
char *p1="123" 声明了个字符串指针p1,指向字符串“ 123 ”,此时的“ 123 ”存放在常量区,并没有在拷贝到栈中,所以不能修改,比如修改p1[0] = '2'就是错误的。如果改为char p1[10] = "123",就可以修改p1的值了。
 
[Question]
以下代码输出什么?
int a =1,b =32 ;
printf("%d,%d",a<
[A] 1,1
[B] 1,0
[C] 0,0
[D] 0,1
[Answer]
执行a<编译器会先将b与31进行and操作,以限制左移的次数小于等于31。b&31=0,则a<执行1<<32时,编译器直接执行算术左移的操作,此时发生溢出,首位的1被移除,其余都为0,最后答案为0。


你可能感兴趣的:(Water~~~)