web-dev-qa-db-ja.com

CのEOFおよび '\ 0'の値は何ですか

EOF'\0'は整数型であることを知っていますが、もしそうならそれらは固定値を持つべきではありませんか?

両方を印刷し、EOFで-1、'\0'で0を取得しました。しかし、これらの値は修正されていますか?

私もこれを持っていました

int a=-1;

printf("%d",a==EOF); //printed 1

EOFおよび'\0'の値は固定整数ですか?

34
theReverseFlick

EOFは、int型と実装依存の負の値を持つ整数定数式に展開されるマクロですが、非常に一般的には-1です。

_'\0'_は、C++では値0のcharと、Cでは値0のintです。

printf("%d",a==EOF);が_1_になった理由は、EOFaに割り当てなかったためです。代わりに、aEOFと等しいかどうかを確認し、それが真(_a == -1 == EOF_)だったので、_1_を出力しました。

49
CB Bailey

NULL'\0'は0に評価されることが保証されているため、(適切なキャストを使用して)値が同一であると見なすことができます。ただし、2つの非常に異なるものを表していることに注意してください。NULLはnull(常に無効) pointer であり、'\0'は文字列ターミネータです。代わりにEOFは、ストリームの終わりを示す負の整数定数です。多くの場合、-1ですが、標準では実際の値については何も言及されていません。

CとC++は、NULL'\0'のタイプが異なります。

  • c ++では'\0'charですが、Cではintです。これは、Cではすべての文字リテラルがintsと見なされるためです。
  • 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ポインター変換

NULLポインター定数は、整数型の整数定数式(5.19)で、ゼロと評価される右辺値です。 NULLポインター定数は、ポインター型に変換できます。結果はその型のNULLポインター値であり、オブジェクトへのポインターまたは関数型へのポインターの他のすべての値と区別できます。同じタイプの2つのNULLポインター値は等しいと比較されます。 NULLポインター定数からcv修飾型へのポインターへの変換は単一の変換であり、ポインター変換の後に修飾変換が続くシーケンスではありません(4.4)。

18.1タイプ

[...]マクロNULLは、この国際標準(4.10)の実装定義のC++ nullポインター定数です。 (可能な定義には0および0Lが含まれますが、(void*)0は含まれません)。

'\0'

0値の文字が存在する必要があります。

2.2文字セット

基本実行文字セットおよび基本実行ワイド文字セットには、それぞれ[...]ヌル文字(それぞれ、ヌルワイド文字)が含まれ、その表現はすべて0ビットです。

'\0'charリテラルです:

2.13.2文字リテラル

文字リテラルは、'x'のように単一引用符で囲まれた1つ以上の文字であり、オプションでL’x ’のように文字Lが前に付きます。 Lで始まらない文字リテラルは、通常の文字リテラルであり、ナロー文字リテラルとも呼ばれます。単一の c-char を含む通常の文字リテラルのタイプはcharであり、値は c-のエンコードの数値に等しい実行文字セットのchar

そして、そのエスケープシーケンスはその値を指定するため、値は0です。

エスケープ\oooは、バックスラッシュとそれに続く1、2、または3つの8進数で構成され、目的の文字の値を指定します。

'\0'は、文字列リテラルを終了するために使用されます。

2.13.4文字列リテラル

必要な連結の後、変換フェーズ7(2.1)では、'\0'がすべての文字列リテラルに追加されるため、文字列をスキャンするプログラムがその終わりを見つけることができます。

EOF

EOFの定義はC89標準に委任され(§27.8.2「Cライブラリファイル」に記載されているように)、実装固有の負の整数として定義されます。

C99

NULL

NULLポインターは0整数で、オプションでvoid *にキャストされます。 NULLはNULLポインターです。

6.3.2.3ポインター

[...]値0の整数定数式、またはvoid *型にキャストされるそのような式は、NULLポインター定数と呼ばれます。 (マクロNULL<stddef.h>(および他のヘッダー)でヌルポインター定数として定義されています。7.17を参照してください。)ヌルポインター定数がポインター型に変換される場合、結果のポインターはヌルポインターと呼ばれます。等しくないオブジェクトまたは関数へのポインタと比較します。

7.17共通定義<stddef.h>

[...]マクロは

NULL

実装定義のNULLポインター定数に展開されます。 [...]

'\0'

'\0'は値0の整数で、文字列を終了するために使用されます。

5.2.1文字セット

[...] null character と呼ばれる、すべてのビットが0に設定されたバイトは、基本実行文字セットに存在します。文字列を終了するために使用されます。

6.4.4.4文字定数

整数文字定数は、'x'のように、単一引用符で囲まれた1つ以上のマルチバイト文字のシーケンスです。 [...]

8進エスケープシーケンスのバックスラッシュに続く8進数字は、整数文字定数の場合は単一文字、ワイド文字定数の場合は単一ワイド文字の構成の一部と見なされます。そのように形成された8進整数の数値は、目的の文字またはワイド文字の値を指定します。 [...]

整数文字定数の型はintです。

EOF

EOFは実装定義の負の整数です

7.19入出力<stdio.h>

7.19.1はじめに

EOF

int型と負の値を持つ整数定数式に展開されます。これは、ファイルの終わり、つまりストリームからの入力がないことを示すためにいくつかの関数によって返されます

26
Matteo Italia

'\ 0'は常にヌル文字または0です。EOFはコンパイラーによって異なりますが、通常は-1であり、常にunsigned char保持できません。 EOFの値に依存することはできません。変更できるためです。常にx == EOF not x == -1ではありません。 '\ 0'の値は常に0です。それを期待できます。

5
Leo Izen

はい、そうです。 '\0'NULLと同じ値で0です(ただし、意味は異なります)。一方、EOFは通常-1です。

printf("%d",a==EOF); //printed 1

この場合、あなたは尋ねています:== EOFですか?印刷1(真)の場合、印刷0(偽)ではありません。

0
BlackBear