2016-09-27 48 views
0

正如評論回答這個問題時說:Why gcc does not produce type mismatch warning for int and char?爲什麼EOF與有效的char值一致?

均爲-1和255 0xFF的任何當前CPU的8位十六進制數。

但EOF等於-1。這是一個矛盾,因爲EOF的值不能與任何有效的8位字符重合。這個例子演示它:

#include <stdio.h> 
int main(void) 
{ 
    char c = 255; 
    if (c == EOF) printf("oops\n"); 
    return 0; 
} 

在我的機器上它打印oops

這個矛盾如何解釋?

+0

'EOF'不是一個字符,而是一個狀態。將它與'char'比較沒有任何意義。 – alk

+0

提示:嘗試'unsigned char'。 –

+0

「* EOF的值不能與任何有效的8位字符重合。*」爲什麼不?仔細想想。 – alk

回答

2

當你的int值進行比較,以一個char值時,charpromotedint值。此升級是自動的,並且是C語言規範的一部分(請參閱,例如this "Usual arithmetic conversions" reference,特別是第4點)。當然,編譯器可以給出警告,但爲什麼它應該是一個有效的語言結構?

還有與實現定義的char的簽名性有關的問題。如果char未簽名,那麼您的條件將是錯誤的。

此外,如果你有關的功能從文件中讀取字符的任何引用只是讀取(例如this one for fgetc and getc),你會發現它們返回int,而不是一個char,正是因爲上述原因。

+0

如果它是一個有效的構造,那麼事實證明EOF屬於有效的字符範圍,而它不能。即使是隱藏提升的結果,Char和int *也不能具有相同的值*。例如,如果EOF設置爲65535,編譯器會發出警告。 EOF爲什麼是'-1'? –

+0

@IgorLiferenko *爲什麼*不能有'int'和'char'具有相同的值?以「97」爲例。無論是存儲在'char','short','int'還是'long long'中,它都存儲爲'97',其中'01100001'位。多種類型,相同的值,存儲方式完全相同。值「97」也恰好是「a」的ASCII碼並不重要,它仍然保存爲「97」。 –

+0

我不想說「不能」,而是說「不能」。無論如何,如果'EOF'成爲'INT_MAX',那麼一切都將是完美的。顯然,使它成爲'-1'是愚蠢的。 –

相關問題