2016-09-27 11 views
0

としては、この質問への回答にコメントで述べている:Why gcc does not produce type mismatch warning for int and char?EOFが有効なchar値と一致するのはなぜですか?

両方-1および255は、任意の現在のCPU上の8ビットHEX番号として0xFFです。

しかし、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

あなたはchar値にint値を比較すると、char値がint値にpromotedです。このプロモーションは自動であり、C言語仕様の一部です(例:this "Usual arithmetic conversions" reference、特にポイント4を参照)。確かにコンパイラは警告を出すことができますが、それが有効な言語構造であればどうしてでしょうか?

実装定義のcharの署名の問題もあります。 charが符号なしの場合、条件はfalseになります。あなたは(たとえば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'に格納されているかどうかに関わらず、それはビット '01100001'で '97'として格納されます。複数のタイプ、同じ値、まったく同じ方法で保存されます。値 '97'は、 '' a ''のASCIIコードにもなりますが、それは問題ではなく、 '97'として保存されています。 –

+0

"できない"の代わりに "してはいけない"と言いたいと思っていました。とにかく、 'EOF'が' INT_MAX'になったら、すべてが完璧です。明らかに、それを '-1'にするのは愚かでした。 –

関連する問題