1. 程式人生 > >C語言中EOF的應用

C語言中EOF的應用

我們在宣告變數c 的時候,必須讓它大到足以存放getchar函式返回的任何值。這裡之所以不把c宣告成char型別,是因為它必須足夠大,除了能儲存任何可能的字元外還要能儲存檔案結束符EOF。因此,我們將c宣告成int型別。
EOF 定義在標頭檔案<stdio.h>中,是個整型數,其具體數值是什麼並不重要,只要它與任何char型別的值都不相同即可。這裡使用符號常量,可以確保程式不需要依賴於其對應的任何特定的數值。
對於經驗比較豐富的C 語言程式設計師,可以把這個字元複製程式編寫得更精煉一些。在C語言中,類似於
c = getchar()
之類的賦值操作是一個表示式,並且具有一個值,即賦值後左邊變數儲存的值。也就是說,
賦值可以作為更大的表示式的一部分出現。如果將為c賦值的操作放在while迴圈語句的測
試部分中,上述字元複製程式便可以改寫成下列形式:
#include <stdio.h>

main()
{
int c;
while ((c = getchar()) != EOF)
putchar(c);
}
在該程式中,while 迴圈語句首先讀一個字元並將其賦值給c
,然後測試該字元是否為檔案
結束標誌。如果該字元不是檔案結束標誌,則執行while語句體,並列印該字元。隨後重複
執行while語句。當到達輸入的結尾位置時,while迴圈語句終止執行,從而整個main函
數執行結束。
以上這段程式將輸入集中化,getchar函式在程式中只出現了一次,這樣就縮短了程式,
整個程式看起來更緊湊。習慣這種風格後,讀者就會發現按照這種方式編寫的程式更易閱讀。
我們經常會看到這種風格。(不過,如果我們過多地使用這種型別的複雜語句,編寫的程式可
能會很難理解,應儘量避免這種情況。)
對while語句的條件部分來說,賦值表示式兩邊的圓括號不能省略。不等於運算子!=的
優先順序比賦值運算子=的優先順序要高,這樣,在不使用圓括號的情況下關係測試!=將在賦值=
操作之前執行。因此語句
c = getchar() != EOF
等價於語句
c = (getchar() != EOF)
該語句執行後,c的值將被置為0 或1(取決於呼叫getchar函式時是否碰到檔案結束標誌),
這並不是我們所希望的結果(更詳細的內容,請參見第2 章的相關部分)。
練習1-6 驗證表示式getchar() != EOF的值是0還是1。
練習1-7 編寫一個列印EOF值的程式。