簡體   English   中英

C中EOF和'\\ 0'的值是多少

[英]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是因為你沒有值分配EOFa 相反,您檢查a是否等於EOF並且由於它是正確的( a == -1 == EOF ),因此打印了1

NULL'\\0'保證為0,因此(使用適當的強制轉換)它們的值可以視為相同; 但是請注意,它們表示兩個截然不同的事物: NULL是空(總是無效的) 指針 ,而'\\0'是字符串終止符。 EOF而是一個負整數常量,指示流的結尾; 通常為-1,但標准並沒有說明其實際價值。

C&C ++在NULL'\\0'的類型方面有所不同:

  • 在C ++中, '\\0'是一個char ,而在C中則是一個int 這是因為在C中所有字符文字都被視為int
  • 在C ++中, NULL是“僅”為整數0,而在C中,可以將其定義為強制轉換為void *的0。 這不能在C ++中完成(並且在注釋中明確禁止),因為在C ++中,指針轉換更加嚴格, void *不能隱式轉換為任何其他指針類型,因此,如果NULLvoid * ,它將是必須在分配時將其強制轉換為目標指針類型:

     int * ptr = (void *) 0; /* valid C, invalid C++ */ 

相關標准報價:

C ++ 98/03

NULL

NULL是一個整數類型,保證求值為0:

4.10指針轉換

空指針常數是整數表達式(5.19)的整數類型的計算結果為零的右值。 空指針常量可以轉換為指針類型。 結果是該類型的空指針值,並且可以與指向對象或函數類型的指針的所有其他值區分開。 相同類型的兩個空指針值應比較相等。 空指針常量到cv限定類型的指針的轉換是一次轉換,而不是指針轉換后跟限定轉換(4.4)的序列。

18.1類型

[...]宏NULL是此國際標准(4.10)中實現定義的C ++空指針常量。 可能的定義包括00L ,但不包括(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庫文件”中所述),在此將其定義為實現特定的負整數。

C99

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.

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