05_論理演算(AND, OR, NOT)

はじめに

この章では、複数の条件を組み合わせるための論理演算(AND, OR, NOT)について学びます。実際のプログラムでは「18歳以上かつチケットを持っている」といった複合条件が頻繁に登場します。

論理演算子の一覧

演算子 意味 結果
&& AND(かつ) true && false false
|| OR(または) true || false true
! NOT(否定) !true false

AND(かつ)条件

#include <iostream>
using namespace std;

int main() {
    int age = 20;
    bool hasTicket = true;

    if (age >= 18 && hasTicket) {
        cout << "入場できます。" << endl;
    } else {
        cout << "入場できません。" << endl;
    }
    return 0;
}

OR(または)条件

#include <iostream>
using namespace std;

int main() {
    bool isMember = false;
    bool hasCoupon = true;

    if (isMember || hasCoupon) {
        cout << "割引が適用されます。" << endl;
    } else {
        cout << "割引対象外です。" << endl;
    }
    return 0;
}

NOT(否定)条件

#include <iostream>
using namespace std;

int main() {
    bool isBanned = false;

    if (!isBanned) {
        cout << "利用可能です。" << endl;
    } else {
        cout << "利用制限中です。" << endl;
    }
    return 0;
}

短絡評価(ショートサーキット)について

複合条件(AND や OR)では、必要がないと判断された後段の条件は評価されない という仕様になっています。

この仕組みを 短絡評価(ショートサーキット) と呼びます。

短絡評価の例

bool check() {
    cout << "check()が呼ばれました" << endl;
    return true;
}

int main() {
    bool result = true || check();
    // true の時点で式の値が確定するため、
    // check() は呼ばれない(短絡評価)
}

実用例:クラッシュ回避

ポインタを使う場合、短絡評価により安全な呼び出しができます。

    // isActive() は判定結果を返す
    if (user != nullptr && user->isActive()) {
        cout << "アクティブなユーザーです。" << endl;
    } else {
        cout << "無効なユーザーまたは非アクティブです。" << endl;
    }
user == nullptr のとき、user->isActive() は実行されずクラッシュを回避できます。条件の左側で false が確定した場合、右側は評価されません(短絡評価)。

コーディング演習

演習1:基本コードを動かす

05_01_logic.cpp を作成し、次のコードを入力して実行しましょう。
// logic.cpp
#include <iostream>
using namespace std;

int main() {
    int age;
    bool hasTicket;
    int ticketInput;

    cout << "年齢を入力してください:";
    cin >> age;
    cout << "チケットを持っていますか?(1=はい, 0=いいえ):";
    cin >> ticketInput;
    hasTicket = (ticketInput == 1);

    if (age >= 18 && hasTicket) {
        cout << "入場できます。" << endl;
    } else {
        cout << "入場できません。" << endl;
    }
    return 0;
}

演習2:コードを改造する

05_01_logic.cpp をコピーして 05_02_logic_mod.cpp として保存し、次の変更を加えてみましょう:
ヒントを見る if (isMember && hasCoupon) で特別割引を先に確認し、次に else if (isMember || hasCoupon) で通常割引を確認する順番にします。

理解度チェック

問題05-1

次のコードを実行すると check() 関数は呼ばれますか?表示される出力はどれか。

#include <iostream>
using namespace std;

bool check() {
    cout << "check()が呼ばれました" << endl;
    return true;
}

int main() {
    bool flag = false && check();
    cout << "終了" << endl;
    return 0;
}
解説を表示 正解:イ
false && check() において、左辺が false なので AND 演算の結果は必ず false と確定します。そのため check() は呼ばれず、表示されるのは「終了」だけです(短絡評価)。

問題05-2

次のコードの出力はどれか。

#include <iostream>
using namespace std;
int main() {
    int age = 25;
    bool isStudent = false;

    if (age < 30 && isStudent) {
        cout << "学生割引が適用されます。" << endl;
    } else {
        cout << "通常料金です。" << endl;
    }
    return 0;
}
解説を表示 正解:イ
isStudentfalse なので AND 条件が成り立たず、else が実行されます。age < 30 は true でも、AND の両方が true でなければ条件は成立しません。

問題05-3

次のコードの出力はどれか。

#include <iostream>
using namespace std;
int main() {
    bool isMember = false;
    bool hasCoupon = true;

    if (isMember || hasCoupon) {
        cout << "割引適用" << endl;
    } else {
        cout << "割引なし" << endl;
    }
    return 0;
}
解説を表示 正解:ア
isMember は false でも、hasCoupon が true なので OR 条件全体が true となり、「割引適用」と表示されます。

問題05-4

bool isBanned = false; のとき、!isBanned の値はどれか。

解説を表示 正解:イ
! は否定演算子で、falsetrue に、truefalse に反転させます。!falsetrue となります。

まとめ