制御ステートメント、演算子、ブール型など、さまざまなものを混同しています。それぞれに独自のルールがあります。
制御ステートメントは、たとえばif
ステートメントC11 6.4.8.1のように機能します。
どちらの形式でも、式が0と等しくない場合、最初のサブステートメントが実行されます。
while
、for
なども同じルールです。これは「真」または「偽」とは何の関係もありません。
ブール結果を生成すると思われる演算子については、実際にはint
値1または0のを生成しています。たとえば、等式演算子C11 6.5.9:
各演算子は、指定された関係が真の場合は1、偽の場合は0になります。
上記のすべては、Cが1999年までブール型を持っていなかったためであり、ブール型を取得した場合でも、上記のルールは変更されていません。したがって、ステートメントと演算子がブール型(C ++やJavaなど)を生成する他のほとんどのプログラミング言語とは異なりint
、値がゼロまたはゼロではない、を生成するだけです。たとえばsizeof(1==1)
、Cでは4、C ++では1になります。
Cの実際のブール型には名前が付けられて_Bool
おり、最新のコンパイラが必要です。ヘッダstdbool.h
定義マクロbool
、true
とfalse
に展開し_Bool
、1
及び0
(C ++との互換性のため)でした。
ただし、制御ステートメントと演算子を実際にブール型を必要とする/生成するかのように扱うことは、優れたプログラミング手法と見なされます。MISRA-Cのような特定のコーディング標準では、このような方法を推奨しています。あれは:
if(ptr == NULL)
の代わりにif(ptr)
。
if((data & mask) != 0)
の代わりにif(data & mask)
。
このようなスタイルの目的は、静的分析ツールを使用して型の安全性を高め、バグを減らすことです。間違いなく、このスタイルは、静的アナライザーを使用する場合にのみ意味があります。場合によっては、たとえば、より読みやすい自己文書化コードにつながります。
if(c == '\0')
良い、意図は明確で、コードは自己文書化されています。
対
if(c)
悪い。何かを意味c
する可能性があり、コードを理解するためにタイプを探す必要があります。整数ですか、ポインタですか、それとも文字ですか?