C言語におけるtrue/false

各言語におけるtrue/falseまとめ - 昼メシ物語

上記blogの方と同様に、if文で何がどう評価されるかについて、自分の興味のある範囲で調べてみました。上記blogのエントリにはやや間違いがあると思われるのでその辺も指摘してみます。

Cにはプリミティブな型としてboolが用意されていません。「0」か「非0」かがfalseとtrueに相当します。浮動小数点数についても同様で、例えば「0.0」はfalseとして扱われます。が、これは分かりづらいと思うのか、

#define BOOL int
#define TRUE 1
#define FALSE 0

のような自前bool定数を作っている例も多々見受けられます。
現在では、ISOのC99で標準ライブラリとしてstdbool.hが導入されています。この中で、_Boolという型が定義されました。(参考:ISO/IEC JTC1/SC22/WG14 - CRationale for International Standard ― Programming Languages ― Cもしくは標準Cライブラリの実装 stdbool.h

ポインタは基本的にtrueですがNULLはfalseとして扱われます。上記サイトの方は、

NULL 定数は stddef.h で以下のように ((void*)0) と定義されているため、偽値として使える。

と書いていらっしゃいますが、falseとして使えるのはそうですが、((void*)0)として定義されているのはその処理系でそうなっているだけで、(void*)でキャストされているかどうかはISO等標準規格で決まっている事ではないと思います(根拠となる文献が見つからない…)。現実には大体の処理系で((void*)0)になっているようですが。

文字列リテラルについては、「"0"」も「""」もtrueとして扱われます。これはこの文字列リテラルがどこかに格納されておりその領域へのポインタが評価されてるためと思われます。