29

文字配列の終端のヌル文字を表すために(char)0とを使用することの違いは何ですか?'\0'

4

4 に答える 4

29

どちらも 0 ですが(char) 0char ですが、'\0'(直感的には)intです。値が 0 の場合、通常、この型の違いはプログラムに影響しません。

'\0'それがそのために意図された定数であるため、私は を好みます。

于 2011-09-28T05:17:24.490 に答える
23

文字リテラルのバックスラッシュ表記を使用すると、文字自体を使用する代わりに文字の数値を指定できます。したがって、'\1'[*] は「数値が 1 の文字」、'\2'「数値が 2 の文字」などを意味します。C の癖により、文字リテラルは実際には typeintを持ち、実際にintは の戻り値など、他のコンテキストでも文字を処理するために使用されますfgetc。したがって'\1'、「数値が 1 である文字の int としての数値」などを意味します。

文字C では数値であるため、「数値が 1 である文字」は実際に (char)1であり、 の余分な装飾'\1'はコンパイラには影響しません - C'\1'と同じ型と値を持ちます。1独自のエスケープ コードを持たない印刷不可能な文字を挿入するために、文字リテラルよりも文字列リテラルを使用します。

個人的には、00 を意味するときに書くことを好み、暗黙の変換に任せます。理解するのが非常に難しいと感じる人もいます。それらの人々と一緒に作業するとき、値が 0 の文字を意味するときに書くと便利です。つまり、すぐに暗黙的に型に変換されると'\0'予想される場合です。同様に、null ポインター定数を意味する場合、値 0 の double を意味する場合などを記述すると役立ちます。0charNULL0.0

コンパイラに違いが生じるかどうか、およびキャストが必要かどうかは、コンテキストによって異なります。'\0'は とまったく同じ型と値を持っているため、まったく同じ状況で に0キャストする必要があります。charしたがって'\0'(char)0と はタイプが異なります。完全に同等の式については、(char)'\0'vs (char)0、または'\0'vsのいずれかを考慮することができます0NULL実装定義の型を持っています - 整数型を持つ可能性があるため、ポインター型にキャストする必要がある場合があります。0.0doubleがありますので、確かに違い0ます。それでも、はおよびfloat f = 1.0;と同じですが、 は intであり、通常は とは異なる値を持ちます。float f = 1;float f = 1.0f1.0 / ii1 / i

したがって、'\0'またはを使用するかどうかの一般的なルール0は、純粋にコードの読者の便宜のためのものです。コンパイラにとってはすべて同じです。あなた (およびあなたの同僚) が好みの外観を選択するか、マクロを定義しますASCII_NUL

[*] または'\01'- バックスラッシュは 10 進数ではなく8 進数を導入するため、0 で始まることを確認して、これをもう少し明確にすることが賢明な場合があります。もちろん、0、1、2 の違いはありません。バックスラッシュの後には 3 桁の 8 進数しか続かないため、「時々」と言い\0101ます\101。それはすべて非常にぎこちなく、さらに装飾につながり\x41ます。大文字の A の'\x0'場合、必要に応じて 0 と書くこともできます。

于 2011-10-13T09:16:45.460 に答える
2

ゼロは、C ではさまざまなことを意味します。null 文字 '\0' を使用する必要があります。そうすれば、意図が文字列の終了であるという混乱がなくなるからです。

char を 0 に設定すると、null 終了を意味する可能性がありますが、文字列の一部としてではなく、計算用の 8 ビット整数として char を使用していることを意味する場合もあります。同じコードでポインターも使用し、それらをゼロと比較すると、これはさらに混乱する可能性があります。ゼロはヌルポインターです。

于 2011-09-28T06:35:46.940 に答える
1

文字配列とは、文字列を取得していることを意味します。単純な文字ですが、文字列の終わりを示す'\0'ため、ユーザーからすべての文字を読み取った後、文字配列の最後で使用することをお勧めします。0'\0'NULL

于 2011-09-28T12:18:57.967 に答える