讀書筆記--C陷阱與缺陷(五)
阿新 • • 發佈:2019-01-27
第五章
第五章乾貨也偏少,但是幾個練習題還不錯,寫出來大家分享下:
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是一個返回整形的函式。
而函式呼叫所導致的開銷比巨集定義要多,所以執行會慢。