1. 程式人生 > >讀書筆記--C陷阱與缺陷(五)

讀書筆記--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是一個返回整形的函式。

而函式呼叫所導致的開銷比巨集定義要多,所以執行會慢。