C++入門|C++とC言語の違い

C++では、真か偽かをboolで見極める。trueとfalseを使いこなせば、条件分岐も無限ループも、修行装置の判定のように分かりやすく扱えます。

C++は、C言語を土台にしながら、より大きなプログラムを作りやすくするための機能が追加された言語です。

これまで学んできたように、C++ではcoutやcin、string、名前空間など、C言語にはなかった便利な仕組みが登場しました。
そして今回学ぶ大切な違いのひとつが、bool型です。

bool型は、真偽値を扱うための型です。
真偽値とは、条件が成り立つか、成り立たないかを表す値です。

C++では、真を表す true と、偽を表す false を使えます。

ドラゴンボール風にたとえるなら、bool型はスカウターの判定ランプです。

条件を満たしているならtrue。
条件を満たしていないならfalse。

たとえば、入力された戦闘力が0以上かどうか、正の整数かどうか、修行を続けるべきかどうかを判断するときに、bool型が役立ちます。

C++で登場する要素意味ドラゴンボール風のイメージ
bool真偽値を扱う型判定ランプ
true条件が成り立つ修行条件クリア
false条件が成り立たない修行条件未達成
if文条件によって処理を分けるスカウター判定で分岐
while(true)条件が常に真の繰り返し終了条件まで続く無限修行
breakループから抜ける修行場から脱出する合図

bool型を理解すると、if文やwhile文の条件がかなり読みやすくなります。

C言語では、条件式の結果を数値的に扱う場面が多くありました。
C++では、trueやfalseを使うことで、条件の意味をよりはっきり表せます。

ここでは、bool型を使ったif文、while(true)による無限ループ、breakによるループ脱出を順番に見ていきましょう。

図:bool型はtrueとfalseを表す判定ランプ

この図が示していること

この図では、bool型がtrueとfalseの2つの値を表すことを示しています。

条件が成り立つ場合はtrue、条件が成り立たない場合はfalseです。
if文やwhile文では、このtrue / falseの結果をもとに、処理を実行するかどうかを判断します。

bool型を使うと、条件判定の意味がはっきりし、プログラムの流れを読み取りやすくなります。

bool型とは何か

bool型は、真偽値を表すためのデータ型です。

C++では、条件の結果をtrueまたはfalseで表せます。

bool result;bool result;

このresultには、trueまたはfalseを入れることができます。

result = true;
result = false;

trueは、条件が成り立つことを表します。
falseは、条件が成り立たないことを表します。

意味イメージ
true真、条件が成り立つスカウター判定OK
false偽、条件が成り立たないスカウター判定NG

たとえば、入力された数値が0以上かどうかを判定する場合、0以上ならtrue、0未満ならfalseを返す関数を作れます。

ドラゴンボール風にたとえるなら、bool型は修行装置の合格判定です。
条件をクリアしていればtrue、クリアしていなければfalseになります。

bool型は条件分岐で使いやすい

bool型は、if文と相性がよいです。

if文は、条件が成り立つときに処理を実行し、成り立たないときはelse側の処理を実行できます。

if (条件式) {
    条件が成り立つときの処理
}
else {
    条件が成り立たないときの処理
}

この条件式の部分に、bool型の値や、bool型を返す関数を使えます。

たとえば、judgeEnergyという関数がtrueを返せばif文の中が実行され、falseを返せばelse側が実行されます。

judgeEnergyの戻り値if文の動き
trueif側の処理を実行する
falseelse側の処理を実行する

このように、bool型を使うと、条件の結果をはっきり表せます。

if文とbool型を使ったプログラム

それでは、bool型を返す関数を使って、入力された気の値が0以上かどうかを判定するプログラムを見てみましょう。

プロジェクト/ファイル名: Chap2_08/main.cpp

#include <iostream>

using namespace std;

// 気の値が0以上かどうかを判定する関数のプロトタイプ宣言
bool judgeEnergy(int);

int main(int argc, char** argv) {
    int energy;

    // キーボードから気の値を入力する
    cout << "気の値を入力:";
    cin >> energy;

    // judgeEnergy関数の戻り値で条件分岐する
    if (judgeEnergy(energy)) {
        cout << "この気の値は0以上です。" << endl;
    }
    else {
        cout << "この気の値は0未満です。" << endl;
    }

    // プログラムが正常に終わったことを示す
    return 0;
}

// 引数が0以上ならtrue、そうでなければfalseを返す
bool judgeEnergy(int energy) {
    if (energy >= 0) {
        return true;
    }
    else {
        return false;
    }
}

実行すると、たとえば次のようになります。

実行結果:0以上の値を入力した場合

気の値を入力:15
この気の値は0以上です。

実行結果:0未満の値を入力した場合

気の値を入力:-3
この気の値は0未満です。

このプログラムでは、judgeEnergy関数がbool型の戻り値を返しています。

入力されたenergyが0以上ならtrueを返します。
0未満ならfalseを返します。

そしてmain関数のif文では、その戻り値を使って表示内容を変えています。

入力値judgeEnergyの戻り値表示される内容
15trueこの気の値は0以上です。
0trueこの気の値は0以上です。
-3falseこの気の値は0未満です。

ドラゴンボール風にたとえるなら、judgeEnergy関数はスカウター判定です。
気の値が0以上なら修行可能と判定してtrueを返し、0未満なら修行不能と判定してfalseを返します。

bool型を返す関数の仕組み

今回の関数は、次のように定義されています。

bool judgeEnergy(int energy) {
    if (energy >= 0) {
        return true;
    }
    else {
        return false;
    }
}

関数名はjudgeEnergyです。
戻り値の型はboolです。
引数としてint型のenergyを受け取ります。

部分意味
bool戻り値がtrueまたはfalseである
judgeEnergy関数名
int energy判定する数値を受け取る
return true;条件を満たす結果を返す
return false;条件を満たさない結果を返す

この関数では、energy >= 0が成り立つかどうかを調べています。

成り立つならtrueを返します。
成り立たないならfalseを返します。

main関数側では、次のように呼び出しています。

if (judgeEnergy(energy)) {

judgeEnergy(energy)の結果がtrueなら、if文の中が実行されます。
falseなら、else側が実行されます。

図:bool型を返す関数でif文を分岐する

この図が示していること

この図では、bool型を返す関数の結果によって、if文の処理が分岐する流れを表しています。

judgeEnergy関数は、入力された気の値が0以上かどうかを判定します。
条件を満たせばtrueを返し、条件を満たさなければfalseを返します。

if文は、そのtrue / falseを見て、どちらのメッセージを表示するかを決めています。

trueとfalseは条件の結果をはっきり表す

C++では、trueとfalseを使うことで、条件の結果を分かりやすく表現できます。

たとえば、次の条件を考えます。

energy >= 0

この条件は、energyが0以上ならtrueです。
energyが0未満ならfalseです。

energyの値energy >= 0結果
10成り立つtrue
0成り立つtrue
-1成り立たないfalse

このように、bool型は条件判定の結果をそのまま値として扱えるため、プログラムの意味が読み取りやすくなります。

ドラゴンボール風に言えば、trueは修行条件クリア、falseは修行条件未達成です。
判定結果が明確なので、次にどの処理へ進むかが分かりやすくなります。

bool型はwhile文にも使える

bool型はif文だけでなく、while文の条件にも使えます。

while文は、条件が成り立っている間、処理を繰り返します。

while (条件式) {
    繰り返す処理
}

ここで条件式にtrueを直接書くと、常に条件が成り立つことになります。

while (true) {
    繰り返す処理
}

これは、処理がずっと繰り返される無限ループです。

ドラゴンボール風にたとえるなら、while(true)は、修行装置が常に修行続行と判定している状態です。
そのままだと終わらないため、どこかでbreakを使ってループを抜ける必要があります。

無限ループとは何か

無限ループとは、終わらずに繰り返し続ける処理のことです。

while(true)のように条件が常にtrueの場合、while文はずっと繰り返されます。

while (true) {
    処理
}

このままだと、プログラムはいつまでも終わりません。

ただし、無限ループは必ず悪いものではありません。
条件を満たすまで入力を繰り返したいときなどに便利です。

たとえば、正の整数が入力されるまで何度も入力を促す場合、while(true)で繰り返し、正しい値が入力されたらbreakで抜ける、という書き方ができます。

使い方内容
while(true)ずっと繰り返す
if文終了条件を判定する
break条件を満たしたらループから抜ける

ドラゴンボール風に言えば、while(true)は終わらない修行場です。
しかし、正しい気の値を入力できたら、breakという脱出口から外へ出られます。

while(true)とbreakを使ったプログラム

次に、while(true)を使って、正の気の値が入力されるまで繰り返すプログラムを見てみましょう。

プロジェクト/ファイル名: Chap2_09/main.cpp

#include <iostream>

using namespace std;

int main(int argc, char** argv) {
    while (true) {
        int energy;

        // 正の気の値を入力してもらう
        cout << "正の気の値を入力してください:";
        cin >> energy;

        // energyが正の値であればループから抜ける
        if (energy > 0) {
            break;
        }

        // 正の値ではない場合は、もう一度入力を促す
        cout << energy << "は正の気の値ではありません" << endl;
    }

    // プログラムが正常に終わったことを示す
    return 0;
}

実行すると、たとえば次のようになります。

正の気の値を入力してください:-5
-5は正の気の値ではありません
正の気の値を入力してください:0
0は正の気の値ではありません
正の気の値を入力してください:-2
-2は正の気の値ではありません
正の気の値を入力してください:8

このプログラムでは、正の値が入力されるまで、入力処理が繰り返されます。

-5や0のような正の値ではない数を入力すると、メッセージが表示され、もう一度入力を求められます。
8のような正の値を入力すると、if文の条件が成り立ち、breakでwhile文から抜けます。

while(true)の中で繰り返される処理

今回のプログラムでは、while(true)の中に主な処理が入っています。

while (true) {
    int energy;

    cout << "正の気の値を入力してください:";
    cin >> energy;

    if (energy > 0) {
        break;
    }

    cout << energy << "は正の気の値ではありません" << endl;
}

while(true)は、常に条件がtrueです。
そのため、通常はずっと繰り返されます。

しかし、ループの中にif文があります。

if (energy > 0) {
    break;
}

energyが0より大きい場合、breakが実行されます。
breakが実行されると、while文から抜けます。

入力値energy > 0動き
-5falseメッセージを表示して繰り返す
0falseメッセージを表示して繰り返す
8truebreakでループを抜ける

このように、無限ループを使う場合は、必ず抜ける条件を用意することが大切です。

breakはループから抜ける合図

breakは、while文やfor文のループから抜けるための命令です。

今回のプログラムでは、次のように使っています。

if (energy > 0) {
    break;
}

これは、energyが正の値ならwhile文から抜ける、という意味です。

ドラゴンボール風にたとえるなら、breakは無限修行場から出るための脱出口です。
修行条件を満たしたら、breakで修行場から出て、次の処理へ進みます。

記述意味
break;ループから抜ける
while(true)ずっと繰り返す
if (energy > 0)抜ける条件を判定する

無限ループを書くときは、breakのようにループを終了する方法を必ず用意しましょう。

図:while(true)はbreakで抜ける

この図が示していること

この図では、while(true)による無限ループと、breakによる脱出の流れを表しています。

while(true)は常に条件がtrueなので、処理を繰り返し続けます。
しかし、ループ内でenergy > 0を判定し、trueになった場合はbreakでループを抜けます。

無限ループを使うときは、どの条件で抜けるのかをはっきり決めることが大切です。

無限ループを使うときの注意点

無限ループは便利ですが、注意が必要です。

while(true)は、そのままだとずっと処理を繰り返します。
breakなどで抜ける条件を書き忘れると、プログラムが終わらなくなります。

while (true) {
    cout << "修行中" << endl;
}

このようなコードは、止める処理がないため、ずっと修行中と表示し続けます。

無限ループを使う場合は、次の3つを確認しましょう。

確認すること内容
抜ける条件があるかif文などで終了条件を判定しているか
breakがあるか条件を満たしたときにループから抜けるか
条件がいつか成り立つか永遠に成り立たない条件になっていないか

実行中のプログラムを強制的に止める方法として、Ctrl+Cキーを使うこともあります。
ただし、通常のプログラムでは、正しく終了できるようにbreakなどの終了処理を入れておくことが大切です。

if文とwhile文でbool型を使う感覚

bool型は、条件分岐や繰り返し処理ととても相性がよいです。

if文では、条件がtrueならif側、falseならelse側へ進みます。
while文では、条件がtrueの間だけ処理を繰り返します。

trueの場合falseの場合
if文if側を実行するelse側へ進む
while文繰り返しを続けるループを終了する

今回の学習では、bool型を次の2つの形で使いました。

プログラムboolの使われ方
Chap2_08/main.cppjudgeEnergy関数がtrueまたはfalseを返す
Chap2_09/main.cppwhile(true)で常に繰り返し、breakで抜ける

ドラゴンボール風に言えば、bool型は修行装置の判定結果です。
trueなら進む。
falseなら別の道へ行く。

この感覚がつかめると、条件分岐やループ処理がかなり読みやすくなります。

C++とC言語の違いとして押さえたいポイント

今回のテーマで押さえておきたいC++とC言語の違いは、bool型を自然に使えることです。

項目内容
bool型trueまたはfalseを扱うための型
true条件が成り立つことを表す
false条件が成り立たないことを表す
bool型の関数判定結果をtrueまたはfalseで返せる
if文boolの結果で処理を分岐できる
while(true)無限ループを表せる
breakループから抜けるために使う

C++では、条件の結果をtrueやfalseとして表せるため、判定の意味が読み取りやすくなります。

たとえば、judgeEnergyという関数名とbool型の戻り値を見れば、この関数は何かを判定してtrueまたはfalseを返すのだと分かります。

ドラゴンボール風に言えば、C++のbool型はスカウターの判定ランプです。
条件を満たせばtrue、満たさなければfalse。
その結果を見て、if文は進む道を決め、while文は修行を続けるかどうかを判断します。

bool型、true、false、while(true)、breakを理解しておくと、C++の条件分岐と繰り返し処理がぐっと扱いやすくなります。