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に評価されることが保証されているため、(適切なキャストを使用して)値が同一であると見なすことができます。ただし、2つの非常に異なるものを表していることに注意してください。NULL
はnull(常に無効) pointer であり、'\0'
は文字列ターミネータです。代わりにEOF
は、ストリームの終わりを示す負の整数定数です。多くの場合、-1ですが、標準では実際の値については何も言及されていません。
CとC++は、NULL
と'\0'
のタイプが異なります。
'\0'
はchar
ですが、Cではint
です。これは、Cではすべての文字リテラルがint
sと見なされるためです。c ++ではNULL
は「単なる」整数0ですが、Cではvoid *
にキャストされる0として定義できます。これはC++では実行できません(また、メモでは明示的に禁止されています)。これは、C++のポインター変換がより厳密であるため、void *
が他のポインター型に暗黙的に変換できないため、NULL
がvoid *
である場合、割り当て時にターゲットポインタータイプにキャストする必要があります。
int * ptr = (void *) 0; /* valid C, invalid C++ */
関連する標準的な引用:
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ライブラリファイル」に記載されているように)、実装固有の負の整数として定義されます。
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
型と負の値を持つ整数定数式に展開されます。これは、ファイルの終わり、つまりストリームからの入力がないことを示すためにいくつかの関数によって返されます
'\ 0'は常にヌル文字または0です。EOFはコンパイラーによって異なりますが、通常は-1であり、常にunsigned char
保持できません。 EOFの値に依存することはできません。変更できるためです。常にx == EOF not x == -1ではありません。 '\ 0'の値は常に0です。それを期待できます。
はい、そうです。 '\0'
はNULL
と同じ値で0です(ただし、意味は異なります)。一方、EOFは通常-1です。
printf("%d",a==EOF); //printed 1
この場合、あなたは尋ねています:== EOFですか?印刷1(真)の場合、印刷0(偽)ではありません。