H - 1.07.条件式の結果とbool型 /

Time Limit: 0 msec / Memory Limit: 0 KB

前のページ | 次のページ

キーポイント

  • 条件式の結果は真のとき1に、偽のとき0になる
  • 1trueで、0falseで表す
  • bool型truefalseだけが入る型
int型の表現 bool型の表現
1 true
0 false

条件式の結果

C++では、真のことを数値の1で表現し、偽のことを数値の0で表現します。
条件式の「計算結果」も真のときは1、偽のときは0になります。

次のプログラムは条件式の結果をそのまま出力し、真のときと偽のときでどのような値を取るかを確認しています。

#include <bits/stdc++.h>
using namespace std;

int main() {
  cout << (5 < 10) << endl; // 真
  cout << (5 > 10) << endl; // 偽
}
実行結果
1
0

演算子の優先順位の関係で、条件式を( )で囲まないといけないので注意して下さい。

出力を見てみると、条件が真のときは1、偽のときは0になっていることがわかります。

1 + 1の計算結果が2という数値になること同じように、条件式5 < 10の計算結果は1という数値になるということです。

trueとfalse

条件式の部分に直接10を書くこともできます。次のプログラムはその例です。

#include <bits/stdc++.h>
using namespace std;

int main() {

  // 1は真を表すのでhelloと出力される
  if (1) {
    cout << "hello" << endl;
  }

  // 0は偽を表すのでこのifの中は実行されない
  if (0) {
    cout << "world" << endl;
  }

}
実行結果
hello

先述したとおり、C++では「1と真」「0と偽」はほとんど同じ意味になります。
しかし、「数値としての1と0」なのか、「真偽を表すための1と0」なのかが分かりにくいことがあります。
そのため、真のことを true 、偽のことを false で表すことができるようになっています。

次のプログラムは上のプログラムと同じ動作をします。

#include <bits/stdc++.h>
using namespace std;

int main() {

  // 1と書くよりも真だということがわかりやすい
  if (true) {
    cout << "hello" << endl;
  }

  // 0と書くよりも偽だということがわかりやすい
  if (false) {
    cout << "world" << endl;
  }

}

bool型

bool型というデータ型があります。この型の変数にはtrueまたはfalseだけが入ります。

#include <bits/stdc++.h>
using namespace std;

int main() {
  int x;
  cin >> x;

  bool a = true;
  bool b = x < 10; // xが10未満のときtrue そうでないときfalseになる
  bool c = false;

  if (a && b) {
    cout << "hello" << endl;
  }
  if (c) {
    cout << "world" << endl;
  }
}
入力
3
実行結果
hello

このように、条件式の結果など、真偽のデータを変数で扱いたい場合はbool型を使います。

いままでif (条件式)と書いていましたが、基本的にはif (bool型の値)ということになります。

ここまでの話をまとめたのが次の表です。

int型の表現 bool型の表現
1 true
0 false

bool型を使う場面

今まで学んできたものと違い、「bool型がないと書けないプログラム(計算)」はありません。
bool型は基本的に「条件式の結果」や「状態が2つしか無いもの」を扱っていることを明示するために使います。

これができることによる恩恵は今はわかりにくいかもしれませんが、1.15.関数で紹介する機能を使う場合など、bool型を使うことでプログラムがわかりやすくなることがあります。
なお、今後は「真」や「偽」という言葉の代わりにtruefalseという言葉を使って説明することがあるので、これらの意味はしっかりと覚えておいてください。


細かい話

細かい話なので、飛ばして問題を解いても良いです。

bool型と数値

実は、01以外の数値もbool型の値のように扱うことができます。
その場合、0のときだけfalse、それ以外の数値はすべてtrueになります。

#include <bits/stdc++.h>
using namespace std;

int main() {
  bool a = 10; // 10はtrue
  bool b = 0; // 0はfalse
  cout << a << endl; // 1
  cout << b << endl; // 0

  // 100はtrue
  if (100) {
    cout << "hello" << endl;
  }
}
実行結果
1
0
hello

if文の節で紹介した===を書き間違える典型的なミスは、この「trueとfalse以外の値もbool型のように受け入れてしまう」という性質によって引き起こされています。
a = bという式の「計算結果」はbになります。そのため、if (a = b)if (b != 0)とほとんど同じ意味になってしまいます。


問題

リンク先の問題を解いてください。