zoukankan      html  css  js  c++  java
  • 读书笔记--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是一个返回整形的函数。

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

     

  • 相关阅读:
    net事件丢失解决方法
    Google排名经验谈
    动力漏洞
    Understand简明参考
    修复iReaper
    Bootstrap源码分析
    UTF8编码字节流错误小析
    OAuth2学习及DotNetOpenAuth部分源码研究
    DynamicModuleUtility对象在.net不同版本下的兼容性问题
    MediaWiKi简明安装与配置笔记
  • 原文地址:https://www.cnblogs.com/chenzhefan/p/7517665.html
Copyright © 2011-2022 走看看