当前位置:首页 > 第2章的参考答案
1.思考题
(1)用#define定义符号常量有什么好处?
答:主要有两个好处,一是“见名知意”,符号常量一般取名和实际含义相吻合,便于记忆和阅读,例如常用PI代表圆周率。二是“一改俱改”,如果一个常量的值改变了,如果程序中直接用常量编程,那么要修改的工作量就很大,尤其是这个变量使用很多的次的时候。使用了符号常量,只要改动#define定义的这个地方就可以了。
(2)用何种办法可以迅速找出回车换行符’\\n’的ASCII码? 答:直接用printf函数输出这个字符的整型值就可以了,例如: printf(\
(3)从整数在机内的表示方式的角度来举例说明整型溢出的问题。 答:例如,整数32767加1就会溢出,程序和机内表示图示如下。 main() {
int a, b; a=32767; b=a+1;
printf(\}
运行后,其结果为: 32767,-32768
这显然不是数学计算的结果,图2-5利用整数在内存中的存储方式来解释程序运行结果。
a=32767:
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -32768 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
(4)写出4个不同的表达式,分别将整型变量n减去1。 答:可能的四个表达式如下:
n--、n=n-1、--n、n-(n>n+1)
(5)试运行下面的代码,猜想其结果是如何来的,并查资料验证你的想法。 void main(void) { int a; int b; int c; c=scanf(“%d%d”, &a, &b); printf(“\\n%d”, c) }
答:scanf函数的返回值为整型,其值为正确按指定格式输入变量的个数。对于此例,结果如下:
如果a和b都被成功读入,那么scanf的返回值就是2; 如果只有a被成功读入,返回值为1; 如果a和b都未被成功读入,返回值为0;
如果遇到错误或遇到end of file,返回值为EOF。 MSDN中的描述如下:
Both scanf and wscanf return the number of fields successfully converted and assigned; the return value does not include fields that were read but not assigned. A return value of 0 indicates that no fields were assigned. The return value is EOF for an error or if the end-of-file character or the end-of-string character is nocountered in the first attempt to read a character.
(6) 试运行下面的代码,输入一个整数后就按回车键,会发生什么现象?请查资料理解。
#include
int a; char c; scanf(“%d” , &a); scanf(“%c” , &c); printf(“a=%d, c=%d\\n” , a, c); }
答:比如,输入一个整数15后按回车,此时程序运行的结果为a=15,c=10。这是因为输入的回车键也放入了键盘缓冲区,然后取出给了c。
2.分析下列程序的结果: (1) void main(void) {
printf(\ printf(\}
答:输出结果如下 f□□□□□□□gde h□□□□□□j□k
这一题要注意\\t的作用,它是从当前位置跳到下一个制表符位置(使得光标位于8n+1列,n=1,2,3,……),中间用空格填充(看起来会删除其他字符)。
(2)
void main(void) {
unsigned int a=65535;
printf(\}
答:输出为
a=-1,177777,ffff,65535
这一题要注意a的内存内容16位全为1,恰好是-1的补码形式,所以十进制输出为-1。八进制和十六进制是无符号整数,所以输出分别是1777777和ffff,转换为十进制数值就是
65535。
(3)
void main(void) {
int x, y, z, a, b, c; x=3; y=3; z=3; y+=++x; z+=x++;
a=(x++)+(++x); b=-x++; c=-++x;
printf(\}
答:输出为
x=9,y=7,z=7,a=12,b=-7,c=-9 (4)
void main(void) {
int a=42, b=-67;
float x=123.456, y=-12.3456;
printf(\ printf(\ printf(\
printf(\ printf(\ printf(\ printf(\ printf(\ printf(\}
答:输出为
42,52,-67,177675 2a,42,ffbd,65469 42,-67
123.456001,123.456,-12.345600,-12.3456 1.23456e+02,-1.23456e+01 123.456001,-12.345600 123.456001,-12.345600 123.456,-12.346 1.23e+02,-1.23e+01
3.设有变量定义char a=’a’; int i=3, j=5,b; float x=2.5; double y=5.0, z;,计算下面表达式的值:
(1)a+i-j+x/y (3)y+=i-=j*=++x; (5)a=a+i,a+j (7)(int)x/(int)y+x
(2)(x+y)+i++ (4)b=a+=j%i (6)a=(a+i,a+j) (8)(float)i/(++j)
答:(1)95.500000 (2)10.500000 (3)-9.000000 (4)99 (5)100 (6)102 (7)2.500000 (8)0.500000
4. 程序改错题
按下列格式输入程序,有那些错误? (1)
void main(void) {
int a, b, c; a=3; b+=++a; c=a++=++a; } (2)
void main(void)
{
int i; i=0169;
printf(\
printf(\,the octonary form is %o,
the hexadecimal form is %xi\
} 答:(1)
void main(void) {
int a, b, c; a=3; b+=++a;
c=a++=++a;/*错误,等号左边只能是变量,所以a++=++a错误*/ }
(2)
void main(void)
{
int i;
i=0169;/*9为非法的八进制字符*/ printf(\
printf(\,the octonary form is %o,
共分享92篇相关文档