[英]What is value of EOF and '\0' in C
我知道EOF
和'\\0'
是整數類型,但是如果不是這樣,它們是否應該具有固定值?
我同時打印了兩個,得到的EOF
為-1和'\\0'
為'\\0'
。 但是這些值是固定的嗎?
我也有這個
int a=-1;
printf("%d",a==EOF); //printed 1
EOF
和'\\0'
的值是固定的整數嗎?
EOF
是一個宏,它可以擴展為一個整數類型為int
且與實現相關的負值的整數常量表達式,但通常為-1。
'\\0'
是C ++中的值為0的char
和C中的值為0的int
。
為什么使用printf("%d",a==EOF);
導致1
是因為你沒有值分配EOF
到a
。 相反,您檢查a
是否等於EOF
並且由於它是正確的( a == -1 == EOF
),因此打印了1
。
NULL
和'\\0'
保證為0,因此(使用適當的強制轉換)它們的值可以視為相同; 但是請注意,它們表示兩個截然不同的事物: NULL
是空(總是無效的) 指針 ,而'\\0'
是字符串終止符。 EOF
而是一個負整數常量,指示流的結尾; 通常為-1,但標准並沒有說明其實際價值。
C&C ++在NULL
和'\\0'
的類型方面有所不同:
'\\0'
是一個char
,而在C中則是一個int
; 這是因為在C中所有字符文字都被視為int
。 在C ++中, NULL
是“僅”為整數0,而在C中,可以將其定義為強制轉換為void *
的0。 這不能在C ++中完成(並且在注釋中明確禁止),因為在C ++中,指針轉換更加嚴格, void *
不能隱式轉換為任何其他指針類型,因此,如果NULL
是void *
,它將是必須在分配時將其強制轉換為目標指針類型:
int * ptr = (void *) 0; /* valid C, invalid C++ */
相關標准報價:
NULL
NULL
是一個整數類型,保證求值為0:
4.10指針轉換
空指針常數是整數表達式(5.19)的整數類型的計算結果為零的右值。 空指針常量可以轉換為指針類型。 結果是該類型的空指針值,並且可以與指向對象或函數類型的指針的所有其他值區分開。 相同類型的兩個空指針值應比較相等。 空指針常量到cv限定類型的指針的轉換是一次轉換,而不是指針轉換后跟限定轉換(4.4)的序列。
18.1類型
[...]宏NULL是此國際標准(4.10)中實現定義的C ++空指針常量。 ( 可能的定義包括
0
和0L
,但不包括(void*)0
)。
'\\0'
0值char必須存在:
2.2字符集
daccess-ods.un.org daccess-ods.un.org基本執行字符集和基本執行寬字符集應分別包含一個空字符(分別為空寬字符),其表示全部為零。
'\\0'
是一個char
文字:
2.13.2字符文字
字符文字是用單引號括起來的一個或多個字符,例如在
'x'
,還可以在字母L之前加上字母,例如在L'x'中。 不以L開頭的字符文字是普通字符文字,也稱為窄字符文字。 包含單個c-char的普通字符文字的類型為char
,其值等於執行字符集中c-char的編碼的數值。
它的值為0,因為該轉義序列指定了它的值:
轉義
\\ooo
由反斜杠組成,后跟一個,兩個或三個八進制數字,用於指定所需字符的值。
'\\0'
用於終止字符串文字:
2.13.4字符串文字
在進行任何必要的連接之后,在轉換階段7(2.1)中,會將
'\\0'
附加到每個字符串文字中,以便掃描字符串的程序可以找到其結尾。
EOF
EOF
的定義委托給C89標准(如第27.8.2節“ C庫文件”中所述),在此將其定義為實現特定的負整數。
NULL
空指針是一個0整數,可以選擇強制轉換為void *
; NULL
是空指針。
6.3.2.3指針
[...]值為0的整數常量表達式,或類型轉換為
void *
的表達式稱為空指針常量。 (在<stddef.h>
(和其他頭文件)中將宏NULL
定義為空指針常量;請參見7.17。)如果將空指針常量轉換為指針類型,則可以保證得到的指針稱為空指針。比較不相等與指向任何對象或函數的指針。7.17通用定義
<stddef.h>
[...]宏是
NULL
擴展為實現定義的空指針常量; [...]
'\\0'
'\\0'
是一個值為0的整數,用於終止字符串:
5.2.1字符集
[...]所有位都設置為0的字節,稱為空字符 ,應存在於基本執行字符集中; 它用於終止字符串。
6.4.4.4字符常量
整數字符常量是用單引號括起來的一個或多個多字節字符的序列,例如
'x'
。 [...]八進制轉義序列中反斜杠后面的八進制數字被視為構成整數字符常數的單個字符或構成寬字符常數的單個寬字符的一部分。 這樣形成的八進制整數的數值指定所需字符或寬字符的值。 [...]
整數字符常量的類型為
int
。
EOF
EOF
是實現定義的負整數
7.19輸入/輸出
<stdio.h>
7.19.1簡介
EOF
它擴展為整數類型為
int
且為負值的整數常量表達式,該表達式由多個函數返回以指示文件結束,即不再有流輸入
'\\ 0'始終是空字符或0。EOF取決於編譯器,但通常為-1,並且始終是unsigned char
無法保存的值。 不要依賴EOF的價值,因為它可以改變。 始終執行x == EOF而不是x == -1。 “ \\ 0”的值始終為0。您可以依靠它。
對,他們是。 '\\0'
具有相同的NULL
,即為0(但它們表示不同的意思),而EOF通常為-1。
printf("%d",a==EOF); //printed 1
在這種情況下,您會問:= = EOF? 如果它是print 1(是true),則不是print 0(false)。
'\\ 0'始終為0
EOF依賴於編譯器
最常見的是-1(在gcc和g ++中為-1)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.