簡體   English   中英

C:為什么在K&R中寫到EOF不適合char?

[英]C: why in K&R is written that EOF does not fit in char?

我剛剛開始學習C編程語言 ,我需要問你以下問題:

我知道函數getchar()會為您提供一個始終為正的整數。 例如,對於\\t ,結果為32,並且該值可以存儲在char中。

K&R的書說,不能將-1 EOF存儲在char中(但實際上可以存儲)。 無論如何,它不適用於未簽名的char。

我對此的理解是char可以存儲-127127值,因此它可以包含-1 ,但是unsigned char只能存儲0255 ,因此它不能包含-1

我對嗎? 為什么K&R的書這么說?

K&R的書說,不能將-1的EOF存儲在char中(但實際上可以存儲)。

該標准沒有規定是否charsignedunsigned類型。 它是由一個實現來決定是否charsignedunsigned類型。 對於使用unsigned類型的char的實現,不能將值-1保留在char int是帶signed類型,可以容納值-1 這就是將int用作getchargetcfgetc的返回類型的原因。

C語言中的getc函數訪問一個流,並返回0到UCHAR_MAX范圍內的非負字節值,或者返回等於EOF常數的值,該值為負。 它以類型int值形式返回。

這兩個數據范圍不能適合char類型,無論它是帶符號的還是無符號的。 如果將EOF值存儲在char ,則會產生歧義,因為它與有效字節值發生沖突。 0UCHAR_MAX的范圍已經聲明了字符類型中的所有可能值。

假設我們現在處在幾乎無處不在的8位二進制補碼世界中。 帶符號的char的值介於-128到127之間。該范圍涵蓋-1:值-1可能出現在char -s流中。 unsigned char范圍為0到255。不會出現值-1; 但是,如果將-1轉換為unsigned char ,它將變為255。這是有效的字節值。 (請注意, EOF不一定為-1,但是類似的推理也適用於其他負值INT_MIN僅表示EOF為負。可能是INT_MIN !)

如果確實使用char捕獲getc的返回值,則必須測試ferror(stream) || feof(stream) ferror(stream) || feof(stream)每次您看到的值等於EOF 如果此測試為假,則EOF實際上是一個字節值,您必須相應地對其進行處理。

(這也必須在發生sizeof (int) == 1的平台上完成)。

暫無
暫無

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

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