读书笔记--C陷阱与缺陷(五)

第五章

       第五章干货也偏少,但是几个练习题还不错,写出来大家分享下:

      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是一个返回整形的函数。

而函数调用所导致的开销比宏定义要多,所以运行会慢。

 

原文地址:https://www.cnblogs.com/chenzhefan/p/7517665.html