C言語の真偽値

C言語の真偽値についての解説です。

C言語の真偽値

C言語では0は偽値で、それ以外が真値です。非常にシンプルです。NULLは、C言語では0と等価として定義されるので、偽値です。

真値0以外
偽値0

if文で真偽値を使ってみましょう。

#include <stdio.h>
#include <stdint.h>

int main(void) {
  int32_t flag = 1;
  // int32_t flag = 0;
  
  if (flag) {
    printf("OK\n");
  }
  else {
    printf("Not OK\n");
  }
}

flagが1の時は「OK」、0のときは「Not OK」と表示されます。

NULLも使ってみましょう。

#include <stdio.h>
#include <stdint.h>

int main(void) {
  const char* string = "Hello";
  // const char* string = NULL;
  
  if (string) {
    printf("OK\n");
  }
  else {
    printf("Not OK\n");
  }
}

文字列が代入されているときは「OK」、NULLが代入されているときは「Not OK」と表示されます。

C言語には真偽値型は存在しますか?

C99でstdbool.hが導入され_Bool型が追加されました。

1か0にしかならない型です。

ただし処理系が1bitで実装するということは考えにくく、最低1バイト使うので、汎用的に使えるint8_tでよいかもしれないとも思います。

普段はint32_tを使って、サイズを節約したい場合はint8_tみたいな。

使うかどうかの判断はお任せします。僕の評価は、あってもよいけど、ないならないでよいという感じです。

Perlの真偽値との違いは?

C言語の真偽値はPerlの真偽値と似ています。

C言語では、0が偽値で、それ以外が真です。NULLは、0と等価として定義されているので、偽になります。

Perlでは、数値0, 文字列の0, undef, 空文字列, 空のリストが、偽値で、それ以外は真です。

体感としては真偽値は、PerlとC言語は似た感覚で使えます。

関連情報