トラック5・📦変数・型・演算子

bool型と真偽——C23標準の書き方

読む目安 約10分・ゴール:C23のbool/true/falseをそのまま使い、Cにおける真偽(0が偽・0以外が真)を説明できる

アプリでこのトピックを学ぶ(無料・登録不要)

このトピックの要点

「はい/いいえ」「オン/オフ」「合格/不合格」。2つに1つの値を扱う型がboolです。C23からは、何の準備もなくそのまま書けます。

C23の書き方

#include <stdio.h>

int main(void) {
    bool goukaku = true;
    bool kesseki = false;

    printf("%d %d\n", goukaku, kesseki);
    return 0;
}

出力は 1 0。bool・true・false はC23で正式なキーワードになりました。古い記事にある #include <stdbool.h> はもう要りません(書いてもエラーにはなりません)。C99〜C17では型名が _Bool で、stdbool.h が別名を用意していた、という歴史です。

Cにおける真と偽

ルールはとても単純です。

・0 が偽
・0以外はすべて真(1でも -5 でも 3.14 でも真)

#include <stdio.h>

int main(void) {
    bool a = 5;    // 0以外なので true
    bool b = 0;    // false
    bool c = -1;   // これも true

    printf("%d %d %d\n", a, b, c);
    return 0;
}

出力は 1 0 1。bool に入れた値は 0 か 1 に正規化されます。5 を入れても、中身は 1 です。

比較の結果も真偽値

#include <stdio.h>

int main(void) {
    int tensuu = 72;
    bool goukaku = (tensuu >= 60);

    printf("合格判定: %d\n", goukaku);
    printf("そのまま : %d\n", tensuu >= 60);
    return 0;
}

>= や == といった比較演算子の結果は、真なら1、偽なら0です。判定結果をいったん bool の変数にしまっておくと、条件が長くなったときにコードが読みやすくなります(条件分岐そのものはトラック6で扱います)。

罠・注意

表示は 1 / 0。 %d で出しても true や false という文字は出ません。文字で出したいなら自分で切り替えます。

bool に入れると情報が減る。 bool n = 100; は 1 になり、100 は失われます。数として使う値を bool に入れてはいけません。

「真=1」とは限らない。 bool に入れれば1ですが、int のままなら 5 も -1 も真です。if (x == 1) と if (x) は同じではありません。

ビットCの世界では「0じゃなければ真」。この一言だけ覚えておけば、条件文で迷わなくなるよ。

まとめ

C23では bool / true / false をそのまま書けます(stdbool.h 不要)。0が偽、0以外はすべて真。比較の結果は 1 か 0 で、bool に代入した値は 0/1 に正規化されます。

アプリでこのトピックを学ぶ(無料・登録不要)

確認問題

確認問題 1

C23で bool 型を使うとき、必要な準備はどれですか。

  1. #include <stdbool.h> を書く
  2. typedef で自分で定義する
  3. 何も要らない。bool / true / false をそのまま書ける
  4. bool はC言語では使えないので int で代用する
答えを見る

正解:C(何も要らない。bool / true / false をそのまま書ける)

C23で bool・true・false は正式なキーワードになりました。stdbool.h は不要です(書いてもエラーにはなりません)。C99〜C17では型名が _Bool で、stdbool.h が別名を用意していた——という歴史を知っておくと、古い記事を読むときに混乱しません。

確認問題 2

bool b = -5; としたあと printf("%d\n", b); を実行すると、何が表示されますか。

  1. -5
  2. 0
  3. 1
  4. コンパイルエラーになる
答えを見る

正解:C(1)

Cでは0が偽、0以外はすべて真です。-5 は0ではないので真、そしてboolに代入された値は 0 か 1 に正規化されるため、中身は 1 になります。もとの -5 は失われるので、数として使いたい値を bool に入れてはいけません。

「変数・型・演算子」の目次

  1. 変数とは名前付きの箱
  2. int型と整数の世界
  3. 浮動小数点数 float / double
  4. char型と文字コード
  5. bool型と真偽——C23標準の書き方
  6. 定数——const と constexpr
  7. 算術演算子と優先順位
  8. 整数の割り算と剰余の罠
  9. 型変換——暗黙と明示
  10. 2進数・16進数リテラル(0b / 0x / 桁区切り')
  11. sizeofとメモリ上のサイズ
  12. オーバーフローという事件

もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。

完全版の販売ページは準備中です。

ほかのトラック

📚 姉妹教材:手を動かして覚える Linux 教材 — Linuxとインフラの仕組みを地図で学ぶ

Web版