簡體   English   中英

關於C中的int,char和EOF的困惑

[英]confusion about int, char, and EOF in C

我正在學習K&R的經典C編程書第二版,這是第17頁的示例:

#include <stdio.h>
/* copy input to output*/
main()
{
    int c; 
    // char c works as well!!
    while ((c = getchar()) != EOF)
        putchar(c);
}

在書中指出, int c用於保存EOF ,在我帶有GCC的Windows機器中,結果為-1 ,不能用char表示。 但是,當我嘗試使用char c它沒有問題。 奇怪的是我嘗試了更多:

int  a = EOF;
char b = EOF;
char e = -1;
printf("%d %d %d %c %c %c \n", a, b, e, a, b, e);

並且輸出為-1 -1 -1 ,不顯示任何字符(實際上根據%c, c ASCII表%c, c此處%c, c應該顯示nbs(no-break space)但它是不可見的)。

那么如何在沒有任何編譯器錯誤的情況下為EOF分配char

此外,假設EOF-1 ,則be是否都在內存中分配給FF以上? 否則編譯器如何區分EOFnbs ...?

更新

最有可能的EOF 0xFFFFFFFF被強制轉換為char 0xFF但是在(c = getchar()) != EOF中,LHS 0xFF在比較之前被int提升為0xFFFFFFFF ,因此c類型可以是intchar

在這種情況下, EOF恰好是0xFFFFFFFF但理論上EOF可以是任何需要8位以上的值才能正確表示的最左端字節(不一定是FFFFFF因此char c方法將失敗。

參考:K&R C編程語言2e

在此處輸入圖片說明

該代碼有效,因為您使用的是簽名 char 如果查看ASCII表 ,則會發現兩件事:首先,只有127個值。 127需要七個位來表示,而最高位是符號位。 其次, EOF不在此表中,因此OS可以自由定義它。

編譯器允許從charint賦值,因為您是從較小的類型分配為較大的類型。 保證int能夠表示char可以表示的任何值。

還需要注意的是0xFF時解釋為等於255 unsigned char和-1時,解釋為一個signed char

0b11111111

但是,當表示為32位整數時,它看起來非常不同:

255 : 0b00000000000000000000000011111111
-127: 0b11111111111111111111111110000001

EOF0xFF不相同。 因此,編譯器必須區分它們。 如果您看到getchar()手冊頁 ,您會知道它會在文件或錯誤結束時將讀取的字符作為無符號字符返回到int或EOF。

您的while((c = getchar()) != EOF)被擴展為

((unsigned int)c != (unsigned int)EOF)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM