この章では、複数の条件を組み合わせるための論理演算(AND, OR, NOT)について学びます。実際のプログラムでは「18歳以上かつチケットを持っている」といった複合条件が頻繁に登場します。
| 演算子 | 意味 | 例 | 結果 |
|---|---|---|---|
&& |
AND(かつ) | true && false |
false |
|| |
OR(または) | true || false |
true |
! |
NOT(否定) | !true |
false |
#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 は評価されません。この仕組みを 短絡評価(ショートサーキット) と呼びます。
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 が確定した場合、右側は評価されません(短絡評価)。
// 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;
}
if (isMember && hasCoupon) で特別割引を先に確認し、次に else if (isMember || hasCoupon) で通常割引を確認する順番にします。
次のコードを実行すると 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() は呼ばれず、表示されるのは「終了」だけです(短絡評価)。
次のコードの出力はどれか。
#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 が実行されます。age < 30 は true でも、AND の両方が true でなければ条件は成立しません。
次のコードの出力はどれか。
#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 となり、「割引適用」と表示されます。
bool isBanned = false; のとき、!isBanned の値はどれか。
! は否定演算子で、false を true に、true を false に反転させます。!false は true となります。
&&:両方が真なら真(AND)||:どちらかが真なら真(OR)!:条件を反転させる(NOT)