40

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

私は両方を印刷し、 に対して -1EOFと に対して 0 を得ました'\0'。しかし、これらの値は固定されていますか?

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

int a=-1;

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

EOFとの値は'\0'固定整数ですか?

4

5 に答える 5

66

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

'\0'は、charC++ では値 0 の であり、C ではint値 0 の です。

printf("%d",a==EOF);結果がになった理由は、 に値を1割り当てなかったためです。代わりに、が等しいかどうかをチェックし、それが true( )だったので、 が出力されました。EOFaaEOFa == -1 == EOF1

于 2011-01-16T14:49:13.707 に答える
28

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

C と C++ は と の型が異なりNULLます'\0'

  • C++ では 、C では'\0';charですint。これは、C ではすべての文字リテラルがints と見なされるためです。
  • C++ ではNULL「ちょうど」整数の 0 ですが、C では にキャストされた 0 として定義できますvoid *。これは C++ では実行できません (注記で明示的に禁止されています)。C++ はポインター変換がより厳密であるため、 avoid *は他のポインター型に暗黙的に変換できないため、 a だった場合NULLは、void *にキャストする必要があります。割り当て時のターゲット ポインターの型:

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

関連する標準引用符:

C++98/03

NULL

NULL0 に評価されることが保証されている整数型です。

4.10 ポインタ変換

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

18.1 タイプ

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

'\0'

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

2.2 文字セット

基本実行文字セットと基本実行ワイド文字セットにはそれぞれ [...] NULL 文字 (それぞれ、NULL ワイド文字) が含まれ、その表現はすべてゼロ ビットです。

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

2.13.2 文字リテラル

文字リテラルは、 のように一重引用符で囲まれた 1 つまたは複数の文字であり'x'、必要に応じて L'x' のように文字 L が先行します。L で始まらない文字リテラルは通常の文字リテラルであり、ナロー文字リテラルとも呼ばれます。単一のc-charを含む通常の文字リテラルのtypeは、実行文字セット内のc-charcharのエンコーディングの数値に等しい値です。

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

エスケープ\oooは、バックスラッシュの後に、目的の文字の値を指定するために使用される 1 桁、2 桁、または 3 桁の 8 進数で構成されます。

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

2.13.4 文字列リテラル

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

EOF

の定義はEOFC89 標準 (§27.8.2「C ライブラリ ファイル」で説明されているように) に委譲されており、実装固有の負の整数として定義されています。

C99

NULL

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

6.3.2.3 ポインタ

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

7.17 一般的な定義<stddef.h>

[...] マクロは

NULL

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

'\0'

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

5.2.1 文字セット

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

6.4.4.4 文字定数

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

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

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

EOF

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

7.19 入出力<stdio.h>

7.19.1 はじめに

EOF

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

于 2011-01-16T15:36:13.410 に答える
6

'\0' は常にヌル文字または 0 です。EOF はコンパイラによって異なりますが、通常は -1 であり、常にunsigned char保持できない値です。変化する可能性があるため、EOF の値が何かであることに依存しないでください。x == -1 ではなく、常に x == EOF を実行します。'\0' の値は常に 0 です。これは信頼できます。

于 2011-01-16T14:49:03.470 に答える
0

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

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

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

于 2011-01-16T14:50:21.737 に答える
-1

'\0' は常に 0 です

EOF はコンパイラに依存します

最も一般的なのは -1 です (gcc と g++ では -1 です)。

于 2011-01-16T14:54:06.760 に答える