第五章
第五章干货也偏少,但是几个练习题还不错,写出来大家分享下:
1.当一个程序异常终止时,程序输出的最后几行常常会丢失,原因是什么?
我们能够采取怎么样的措施来解决这个问题?
答:因为异常终止的程序可能没机会清空输出缓冲区,程序生存的输出可能位于内存的某个位置,但永远不会被写出。
这种现象会误导程序员以为:程序失败的时刻比实际失败的时刻要早。
解决办法是调试时强制不允许对输出进行缓冲,某种形式如下:
setbuf(stdout, (char *)0);
该语句必须在任何输出被写入到stdout(包括printf()) 之前执行,最恰当的位置是作为main函数的第一个语句。
2.以下程序作用是把输入复制到输出:
1 #include <stdio.h> 2 3 4 main() 5 6 7 { 8 9 10 register int c; 11 12 13 while ((c = getchar()) != EOF) 14 15 16 putchar(c); 17 18 19 }
从以上程序中移除 #include <stdio.h>, 将导致程序不能编译,但是假设我们定义了EOF(不推荐)
1 #define EOF -1 2 3 4 main() 5 6 7 { 8 9 10 register int c; 11 12 13 while ((c = getchar()) != EOF) 14 15 16 putchar(c); 17 18 19 }
以上程序可以运行,但是会慢很多?
答:因为getchar()在头文件 stdio.h是宏定义实现的,这里的 getchar() 没有声明头文件,编译器会假定getchar是一个返回整形的函数。
而函数调用所导致的开销比宏定义要多,所以运行会慢。