文字配列の終端のヌル文字を表すために(char)0
とを使用することの違いは何ですか?'\0'
4 に答える
どちらも 0 ですが(char) 0
char ですが、'\0'
(直感的には)int
です。値が 0 の場合、通常、この型の違いはプログラムに影響しません。
'\0'
それがそのために意図された定数であるため、私は を好みます。
文字リテラルのバックスラッシュ表記を使用すると、文字自体を使用する代わりに文字の数値を指定できます。したがって、'\1'
[*] は「数値が 1 の文字」、'\2'
「数値が 2 の文字」などを意味します。C の癖により、文字リテラルは実際には typeint
を持ち、実際にint
は の戻り値など、他のコンテキストでも文字を処理するために使用されますfgetc
。したがって'\1'
、「数値が 1 である文字の int としての数値」などを意味します。
文字はC では数値であるため、「数値が 1 である文字」は実際には (char)1
であり、 の余分な装飾'\1'
はコンパイラには影響しません - C'\1'
と同じ型と値を持ちます。1
独自のエスケープ コードを持たない印刷不可能な文字を挿入するために、文字リテラルよりも文字列リテラルを使用します。
個人的には、0
0 を意味するときに書くことを好み、暗黙の変換に任せます。理解するのが非常に難しいと感じる人もいます。それらの人々と一緒に作業するとき、値が 0 の文字を意味するときに書くと便利です。つまり、すぐに暗黙的に型に変換されると'\0'
予想される場合です。同様に、null ポインター定数を意味する場合、値 0 の double を意味する場合などを記述すると役立ちます。0
char
NULL
0.0
コンパイラに違いが生じるかどうか、およびキャストが必要かどうかは、コンテキストによって異なります。'\0'
は とまったく同じ型と値を持っているため、まったく同じ状況で に0
キャストする必要があります。char
したがって'\0'
、(char)0
と はタイプが異なります。完全に同等の式については、(char)'\0'
vs (char)0
、または'\0'
vsのいずれかを考慮することができます0
。NULL
実装定義の型を持っています - 整数型を持つ可能性があるため、ポインター型にキャストする必要がある場合があります。0.0
型double
がありますので、確かに違い0
ます。それでも、はおよびfloat f = 1.0;
と同じですが、 は intであり、通常は とは異なる値を持ちます。float f = 1;
float f = 1.0f
1.0 / i
i
1 / i
したがって、'\0'
またはを使用するかどうかの一般的なルール0
は、純粋にコードの読者の便宜のためのものです。コンパイラにとってはすべて同じです。あなた (およびあなたの同僚) が好みの外観を選択するか、マクロを定義しますASCII_NUL
。
[*] または'\01'
- バックスラッシュは 10 進数ではなく8 進数を導入するため、0 で始まることを確認して、これをもう少し明確にすることが賢明な場合があります。もちろん、0、1、2 の違いはありません。バックスラッシュの後には 3 桁の 8 進数しか続かないため、「時々」と言い\0101
ます\101
。それはすべて非常にぎこちなく、さらに装飾につながり\x41
ます。大文字の A の'\x0'
場合、必要に応じて 0 と書くこともできます。
ゼロは、C ではさまざまなことを意味します。null 文字 '\0' を使用する必要があります。そうすれば、意図が文字列の終了であるという混乱がなくなるからです。
char を 0 に設定すると、null 終了を意味する可能性がありますが、文字列の一部としてではなく、計算用の 8 ビット整数として char を使用していることを意味する場合もあります。同じコードでポインターも使用し、それらをゼロと比較すると、これはさらに混乱する可能性があります。ゼロはヌルポインターです。
文字配列とは、文字列を取得していることを意味します。単純な文字ですが、文字列の終わりを示す'\0'
ため、ユーザーからすべての文字を読み取った後、文字配列の最後で使用することをお勧めします。0
'\0'
NULL