![](/img/trans.png)
[英]RegEx: Switch from ANSI C++ style open braces (new line) to K&R style (same line as the statement)
[英]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可以存儲-127
到127
值,因此它可以包含-1
,但是unsigned char只能存儲0
到255
,因此它不能包含-1
。
我對嗎? 為什么K&R的書這么說?
K&R的書說,不能將-1的EOF存儲在char中(但實際上可以存儲)。
該標准沒有規定是否char
的signed
或unsigned
類型。 它是由一個實現來決定是否char
的signed
或unsigned
類型。 對於使用unsigned
類型的char
的實現,不能將值-1
保留在char
。 int
是帶signed
類型,可以容納值-1
。 這就是將int
用作getchar
, getc
和fgetc
的返回類型的原因。
C語言中的getc
函數訪問一個流,並返回0到UCHAR_MAX
范圍內的非負字節值,或者返回等於EOF
常數的值,該值為負。 它以類型int
值形式返回。
這兩個數據范圍不能適合char
類型,無論它是帶符號的還是無符號的。 如果將EOF
值存儲在char
,則會產生歧義,因為它與有效字節值發生沖突。 0
到UCHAR_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.