この章では、複数の条件を組み合わせるための論理演算(AND, OR, NOT)について学びます。
#include <iostream>
using namespace std;
int main() {
int age = 20;
bool hasTicket = true;
if (age >= 18 && hasTicket) {
cout << "入場できます。" << endl;
} else {
cout << "入場できません。" << endl;
}
return 0;
}&& は AND 条件を表します#include <iostream>
using namespace std;
int main() {
bool isMember = false;
bool hasCoupon = true;
if (isMember || hasCoupon) {
cout << "割引が適用されます。" << endl;
} else {
cout << "割引対象外です。" << endl;
}
return 0;
}|| は OR 条件を表します#include <iostream>
using namespace std;
int main() {
bool isBanned = false;
if (!isBanned) {
cout << "利用可能です。" << endl;
} else {
cout << "利用制限中です。" << endl;
}
return 0;
}! は条件を否定する演算子です(true ⇔ false)複合条件(ANDやOR)では、必要がないと判断された後段の条件は評価されない という仕様になっています。
A && B:Aがfalseの時点で結果はfalseと確定するため、Bは評価されません。A || B:Aがtrueの時点で結果はtrueと確定するため、Bは評価されません。この仕組みを 短絡評価(ショートサーキット) と呼び、 重い処理や関数呼び出しを含む条件でも、自動的に無駄な処理を避けるようになっています。
例えば以下のようなコードでは、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;
}user == nullptr
のとき、user->isActive()
は実行されずクラッシュを回避できます。次のコードを実行すると、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 なので
check() は呼ばれません。#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
#include <iostream>
using namespace std;
int main() {
bool isMember = true;
bool hasCoupon = false;
if (isMember || hasCoupon) {
cout << "割引適用" << endl;
} else {
cout << "割引なし" << endl;
}
return 0;
}&&:両方が真なら真||:どちらかが真なら真! :条件を反転させる