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

はじめに

この章では、複数の条件を組み合わせるための論理演算(AND, OR, NOT)について学びます。


AND(かつ)条件(05_and_example.cpp)

#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(または)条件(05_or_example.cpp)

#include <iostream>
using namespace std;

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

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

NOT(否定)条件(05_not_example.cpp)

#include <iostream>
using namespace std;

int main() {
    bool isBanned = false;

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

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

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

この仕組みを 短絡評価(ショートサーキット) と呼び、 重い処理や関数呼び出しを含む条件でも、自動的に無駄な処理を避けるようになっています。

例えば以下のようなコードでは、check() 関数が呼ばれません:

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

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

この特性を利用して、安全な条件記述(NULLチェックなど)にも応用できます。

実用例:クラッシュ回避にも使える

以下のようにポインタを使う場合、短絡評価により安全な呼び出しのための典型的な活用例です。

    // isActive()は判定結果を返す
    if (user != nullptr && user->isActive()) {
        cout << "アクティブなユーザーです。" << endl;
    } else {
        cout << "無効なユーザーまたは非アクティブです。" << endl;
    }

理解度チェック

問題1(05_short_circuit_check.cpp)

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

#include <iostream>
using namespace std;

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

int main() {
    bool flag = false && check();
    cout << "終了" << endl;
    return 0;
}
正解・解説を見る
終了

問題2(05_check_logic_and.cpp)
#include <iostream>
using namespace std;

int main() {
    int age = 25;
    bool isStudent = false;

    if (age < 30 && isStudent) {
        cout << "学生割引が適用されます。" << endl;
    } else {
        cout << "通常料金です。" << endl;
    }
    return 0;
}
正解・解説を見る
通常料金です。

isStudent が false なので AND 条件が成り立たず、else が実行されます。


演習問題

問題(05_logic_discount.cpp)

会員またはクーポンを持っていれば「割引適用」、どちらもなければ「割引なし」と表示するプログラムを書きなさい。

解答例を見る
// 05_logic_discount.cpp
#include <iostream>
using namespace std;

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

    if (isMember || hasCoupon) {
        cout << "割引適用" << endl;
    } else {
        cout << "割引なし" << endl;
    }
    return 0;
}

まとめ