一、输入函数和输出函数
1.输入函数scanf
(1)
问题
解析
scanf函数中格式控制后面应该是变量地址,A选项中应为&ch,而不是ch,所以错误。getchar函数没有参数,所以B、C选项错误。
总结
输入字符可以使用scanf函数,也可以使用getchar函数,注意getchar函数没有参数,并且一次调用只能输入一个字符。
其次scanf函数的使用如格式控制,格式的声明都要注意。
(2)
问题
总结
%m.nf格式是printf函数独有的,scanf函数不支持这个格式。
2.逗号表达式
问题
解析
这个表达式输入逗号表达式,从左往右执行每个表达式,值为最后一个表达式的值。本题执行顺序是先执行(k=3*2,k+4),而括号里先执行k=3*2,则k为6;再执行k+4,则k为10。所以括号内表达式得出的值就为10,此时整体变为10,k*3;k*3为18,所以最后表达式的值为18。
问题
解析
先执行右边的表达式,括号内也是一个逗号表达式,先执行a=5,然后执行b=5,随后a自减1变为4,;逗号表达式的值为b的值即5,再赋值给x。所以最后x为5,a为4,b也为5。
3.输出函数printf
3.1和逗号表达式的区别
printf函数的形式可以表现为printf(参数1,参数2,参数3,……,参数n),参数1就是指定输出格式,其余参数也可以出现表达式。但它们并不是逗号表达式,它们仍属于参数,只是用逗号分隔开来。
这里需要注意的是,根据编译器不同,得到的结果也会不同,有些编译器按从右到左的顺序求值参数,这个顺序执行下来,输出是1,1,1。但是有些编译器是从左到右的顺序,这样就是1,2,2。输出是严格按照从左到右进行输出的。
本人接触的都是从右到左的顺序,所以这道题选A。
4.格式符
(1)带符号和不带符号
d和i都是带符号十进制形式,o、x(X)、u都是无符号形式并且不带前导符。如:c=026,以%o格式输出时为26。
y被默认定义成unsigned int,即无符号整型,则C、D不符合条件,而A中%d是有符号的十进制,也不符合题意,所以选B。
(2)-1和65535
#include <stdio.h>
void main() {
int a = -1;
printf("%u,%o,%x\n", a,a);
unsigned b = 65535;
printf("%d,%o,%x",b,b,b);
}
首先看运行结果:
事实上,这是因为unsigned的位数是由系统决定的,图中的运行结果是在32位系统情况下得到的。
65535实际变为二进制是1111111111111111(共16个1),但是在32位系统里他还需要在前面再添加16个0。这样在转为有符号的十进制时,因为最高位是0,所以计算下来为65535。
但是在16位系统里,它就只有16位,即16个1,这时候因为全为1表示-1的补码。所以按有符号十进制输出就为-1。
同样地,对于-1,在32位系统里以无符号整型输出应该为4294967295(即32位全为1的二进制)
所以具体得到什么值要看系统位数。