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

 

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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值