C++のelse if文は、複数の条件を上から順番に判定し、最初に成立した条件に対応する処理だけを実行するための構文です。
たとえば、点数によって評価を分ける場合は、次のように記述します。
if (score >= 80) {
std::cout << "評価A";
} else if (score >= 60) {
std::cout << "評価B";
} else {
std::cout << "評価C";
}
このコードでは、最初にscore >= 80を確認します。
条件が成立しなかった場合だけ、次のscore >= 60が評価されます。
どちらの条件も成立しなければ、最後のelseに書かれた処理が実行されます。
else if文の基本構文
基本的な書き方
else if文の基本形は次のとおりです。
if (条件1) {
// 条件1がtrueの場合の処理
} else if (条件2) {
// 条件1がfalseで、条件2がtrueの場合の処理
} else if (条件3) {
// 条件1と条件2がfalseで、条件3がtrueの場合の処理
} else {
// すべての条件がfalseの場合の処理
}
else ifは、必要に応じて複数追加できます。
if (condition1) {
// 処理1
} else if (condition2) {
// 処理2
} else if (condition3) {
// 処理3
} else if (condition4) {
// 処理4
} else {
// その他の処理
}
最後のelseは省略できる
最後のelseは必須ではありません。
if (age >= 20) {
std::cout << "20歳以上です";
} else if (age >= 18) {
std::cout << "18歳または19歳です";
}
この場合、ageが18未満であれば、どの処理も実行されません。
すべてのケースに対する処理を用意したい場合は、最後にelseを追加します。
if (age >= 20) {
std::cout << "20歳以上です";
} else if (age >= 18) {
std::cout << "18歳または19歳です";
} else {
std::cout << "18歳未満です";
}
else if文の実行順序
条件は上から順番に評価される
else if文では、条件が上から順番に評価されます。
int score = 75;
if (score >= 90) {
std::cout << "優秀";
} else if (score >= 70) {
std::cout << "合格";
} else if (score >= 50) {
std::cout << "再試験";
} else {
std::cout << "不合格";
}
scoreが75の場合、処理は次のように進みます。
score >= 90を確認する- 条件が成立しないため、次へ進む
score >= 70を確認する- 条件が成立するため、「合格」を表示する
- それ以降の条件は評価しない
出力結果は次のとおりです。
合格
最初に成立した処理だけが実行される
scoreが75の場合、次の条件も成立します。
score >= 50
しかし、すでにscore >= 70が成立しているため、score >= 50は評価されません。
else if文では、最初にtrueになった条件の処理だけが実行されます。
後続の条件式も評価されない
条件式の中で関数を呼び出している場合も、最初の条件が成立した時点で、後続の関数は呼び出されません。
if (checkA()) {
// checkA()がtrueの場合
} else if (checkB()) {
// checkA()がfalseの場合だけcheckB()が呼ばれる
} else if (checkC()) {
// checkA()とcheckB()がfalseの場合だけcheckC()が呼ばれる
}
この動作は、不要な処理を避けるうえでも重要です。
条件を書く順番
範囲の広い条件を先に書かない
条件の順番を間違えると、意図した処理が実行されないことがあります。
if (score >= 70) {
std::cout << "C";
} else if (score >= 80) {
std::cout << "B";
} else if (score >= 90) {
std::cout << "A";
}
scoreが95の場合でも、最初のscore >= 70が成立します。
そのため、出力結果はAではなくCになります。
C
点数のような段階評価では、通常は条件の厳しいものから順番に書きます。
if (score >= 90) {
std::cout << "A";
} else if (score >= 80) {
std::cout << "B";
} else if (score >= 70) {
std::cout << "C";
} else {
std::cout << "D";
}
小さい値から判定することもできる
必ず大きい値から書かなければならないわけではありません。
条件の作り方によっては、小さい値から順番に判定できます。
if (score < 0) {
std::cout << "入力エラー";
} else if (score < 60) {
std::cout << "不合格";
} else if (score < 80) {
std::cout << "合格";
} else {
std::cout << "優秀";
}
重要なのは、前の条件によって後ろの条件が実行できなくならないように並べることです。
else ifと複数のifの違い
else ifでは1つの処理だけが実行される
次のコードでは、最初の条件が成立すると、後ろの条件は評価されません。
int number = 15;
if (number > 10) {
std::cout << "10より大きい\n";
} else if (number > 5) {
std::cout << "5より大きい\n";
}
出力結果は次のとおりです。
10より大きい
number > 5も成立していますが、最初の条件がすでに成立しているため、2つ目の処理は実行されません。
複数のifはそれぞれ独立して評価される
複数のif文を独立して書いた場合は、それぞれの条件が評価されます。
int number = 15;
if (number > 10) {
std::cout << "10より大きい\n";
}
if (number > 5) {
std::cout << "5より大きい\n";
}
出力結果は次のとおりです。
10より大きい
5より大きい
複数の候補から1つだけ処理したい場合はelse ifを使い、複数の条件を個別に確認したい場合は独立したif文を使います。
比較演算子
主な比較演算子
条件式では、比較演算子を使用します。
| 演算子 | 意味 | 使用例 |
|---|---|---|
== | 等しい | x == 10 |
!= | 等しくない | x != 10 |
> | より大きい | x > 10 |
< | より小さい | x < 10 |
>= | 以上 | x >= 10 |
<= | 以下 | x <= 10 |
正の数、負の数、0を判定する場合は、次のように書けます。
int number = 0;
if (number > 0) {
std::cout << "正の数";
} else if (number < 0) {
std::cout << "負の数";
} else {
std::cout << "0";
}
=と==の違い
=は代入演算子、==は比較演算子です。
値が等しいかを確認する場合は、==を使います。
if (number == 10) {
std::cout << "10です";
}
次のコードでは、比較ではなく代入が行われています。
if (number = 10) {
std::cout << "10です";
}
処理の流れは次のとおりです。
numberに10を代入する- 代入式全体の値が10になる
- 10は0ではないため
trueとして扱われる if文の中が実行される
0を代入した場合は、falseとして扱われます。
if (number = 0) {
std::cout << "この処理は実行されません";
}
比較を行う場合は、必ず==を使用します。
論理演算子
AND条件の&&
複数の条件をすべて満たす必要がある場合は、&&を使用します。
int age = 25;
if (age >= 20 && age < 30) {
std::cout << "20代です";
}
この条件は、age >= 20とage < 30の両方が成立した場合にtrueになります。
OR条件の||
複数の条件のうち、どれか1つでも成立すればよい場合は、||を使用します。
char rank = 'A';
if (rank == 'A' || rank == 'B') {
std::cout << "高評価です";
}
NOT条件の!
条件の真偽を反転させる場合は、!を使用します。
bool loggedIn = false;
if (!loggedIn) {
std::cout << "ログインしてください";
}
loggedInがfalseであれば、!loggedInはtrueになります。
&&と||の短絡評価
C++の&&と||には、短絡評価があります。
if (ptr != nullptr && ptr->isValid()) {
std::cout << "有効なデータです";
}
ptr != nullptrがfalseの場合、右側のptr->isValid()は評価されません。
||の場合は、左側がtrueになると右側が評価されません。
if (isAdmin || checkPermission()) {
std::cout << "アクセスできます";
}
isAdminがtrueであれば、checkPermission()は呼び出されません。
範囲判定の書き方
数学と同じ書き方はできない
数学では、0より大きく10より小さいことを次のように表します。
0 < x < 10
しかし、C++で次のように書くと、正しい範囲判定になりません。
if (0 < x < 10) {
std::cout << "範囲内です";
}
C++では、比較演算子<は左結合なので、次のように解釈されます。
if ((0 < x) < 10) {
std::cout << "範囲内です";
}
最初の比較である0 < xの結果は、trueまたはfalseです。
その後、trueは1、falseは0として比較されます。
1 < 10
または、
0 < 10
どちらもtrueになるため、通常の数値型では条件が常に成立します。
正しい範囲判定
正しい書き方は、&&を使う方法です。
if (0 < x && x < 10) {
std::cout << "xは0より大きく10未満です";
}
次のように書いても同じ意味です。
if (x > 0 && x < 10) {
std::cout << "xは0より大きく10未満です";
}
0以上10未満を判定する場合は、次のように書きます。
if (x >= 0 && x < 10) {
std::cout << "xは0以上10未満です";
}
&&と||を間違えない
1以上10以下を判定する場合、次の条件は正しくありません。
if (number >= 1 || number <= 10) {
std::cout << "範囲内";
}
100の場合はnumber >= 1が成立し、マイナス100の場合はnumber <= 10が成立します。
そのため、通常の数値では常にtrueになります。
正しくは&&を使います。
if (number >= 1 && number <= 10) {
std::cout << "範囲内";
}
年齢を判定する例
条件分岐を使った年齢区分
#include <iostream>
int main() {
int age;
std::cout << "年齢を入力してください: ";
std::cin >> age;
if (age < 0) {
std::cout << "正しい年齢を入力してください\n";
} else if (age <= 12) {
std::cout << "12歳以下です\n";
} else if (age <= 19) {
std::cout << "13歳以上19歳以下です\n";
} else if (age <= 64) {
std::cout << "20歳以上64歳以下です\n";
} else {
std::cout << "65歳以上です\n";
}
return 0;
}
それぞれの条件が表す範囲は次のとおりです。
| 条件 | 実際の範囲 |
|---|---|
age < 0 | 0未満 |
age <= 12 | 0以上12以下 |
age <= 19 | 13以上19以下 |
age <= 64 | 20以上64以下 |
else | 65以上 |
age <= 19の条件に到達した時点で、age <= 12が成立しなかったことが分かっています。
そのため、次のように下限を書く必要はありません。
else if (age >= 13 && age <= 19)
文字列を条件にする
std::stringの比較
std::stringは、==を使って内容を比較できます。
#include <iostream>
#include <string>
int main() {
std::string command;
std::cout << "コマンドを入力してください: ";
std::cin >> command;
if (command == "start") {
std::cout << "開始します\n";
} else if (command == "stop") {
std::cout << "停止します\n";
} else if (command == "pause") {
std::cout << "一時停止します\n";
} else {
std::cout << "不明なコマンドです\n";
}
return 0;
}
文字列の比較では、大文字と小文字が区別されます。
"start" != "Start"
startとStartは別の文字列として扱われます。
C形式の文字列との違い
const char*などのC形式の文字列では、==によって文字列の内容を比較できません。
const char* command = "start";
if (command == "start") {
// ポインタの値を比較する可能性がある
}
C形式の文字列を比較する場合は、std::strcmpを使用します。
#include <cstring>
if (std::strcmp(command, "start") == 0) {
std::cout << "開始します\n";
}
C++では、特別な理由がなければstd::stringを使うほうが扱いやすいでしょう。
bool型を条件にする
bool値はそのまま使える
bool型の変数は、そのまま条件式に使用できます。
bool isLoggedIn = true;
if (isLoggedIn) {
std::cout << "ログイン済みです";
} else {
std::cout << "ログインしていません";
}
次のように書くこともできます。
if (isLoggedIn == true)
ただし、一般的には次の書き方が簡潔です。
if (isLoggedIn)
反対の条件を確認する場合は、!を使用します。
if (!isLoggedIn) {
std::cout << "ログインしてください";
}
数値を条件にする
0はfalse、0以外はtrue
C++では、整数を条件式に使用できます。
int number = 5;
if (number) {
std::cout << "実行されます";
}
整数は、次のように真偽値へ変換されます。
- 0:
false - 0以外:
true
負の数も0ではないため、trueとして扱われます。
int number = -3;
if (number) {
std::cout << "実行されます";
}
意図を明確にしたい場合は、次のように書けます。
if (number != 0) {
std::cout << "0ではありません";
}
波かっこの省略
1文だけなら省略できる
ifやelseの処理が1文だけの場合、波かっこを省略できます。
if (score >= 80)
std::cout << "合格";
else
std::cout << "不合格";
ただし、処理を追加したときに、意図しない動作が起こる可能性があります。
if (score >= 80)
std::cout << "合格\n";
std::cout << "おめでとうございます\n";
このコードでは、条件の影響を受けるのは最初の1文だけです。
実際には次の意味になります。
if (score >= 80) {
std::cout << "合格\n";
}
std::cout << "おめでとうございます\n";
安全性と読みやすさを考えると、波かっこを付ける書き方が適しています。
if (score >= 80) {
std::cout << "合格\n";
std::cout << "おめでとうございます\n";
}
入れ子のif文
if文の中に別のif文を書ける
if文の中に別のif文を書くことを、ネストまたは入れ子と呼びます。
int age = 25;
bool hasLicense = true;
if (age >= 18) {
if (hasLicense) {
std::cout << "運転できます";
} else {
std::cout << "免許が必要です";
}
} else {
std::cout << "年齢条件を満たしていません";
}
同じ条件を、論理演算子とelse ifで表現することもできます。
if (age >= 18 && hasLicense) {
std::cout << "運転できます";
} else if (age >= 18 && !hasLicense) {
std::cout << "免許が必要です";
} else {
std::cout << "年齢条件を満たしていません";
}
条件の重複を減らすなら、次のように書けます。
if (age < 18) {
std::cout << "年齢条件を満たしていません";
} else if (!hasLicense) {
std::cout << "免許が必要です";
} else {
std::cout << "運転できます";
}
elseが対応するif
最も近い未対応のifに結び付く
波かっこを省略した入れ子では、elseがどのifに対応するのか分かりにくくなる場合があります。
if (age >= 18)
if (hasLicense)
std::cout << "運転できます";
else
std::cout << "免許がありません";
このelseは、外側のifではなく、内側のif (hasLicense)に対応します。
if (age >= 18) {
if (hasLicense) {
std::cout << "運転できます";
} else {
std::cout << "免許がありません";
}
}
このような曖昧さを避けるためにも、波かっこを付けることが重要です。
else ifの文法構造
else ifは1つのキーワードではない
C++では、else ifという1つのキーワードが存在するわけではありません。
elseの後ろに別のif文を書いている構造です。
if (condition1) {
// 処理1
} else {
if (condition2) {
// 処理2
}
}
この構造を読みやすく書いたものが、次の形式です。
if (condition1) {
// 処理1
} else if (condition2) {
// 処理2
}
switch文との使い分け
範囲判定にはif文を使う
数値の範囲や複雑な条件を判定する場合は、if文やelse if文が適しています。
if (score >= 80) {
std::cout << "評価A";
} else if (score >= 60) {
std::cout << "評価B";
} else {
std::cout << "評価C";
}
特定の値との一致にはswitch文を使える
1つの値を複数の定数と比較する場合は、switch文が適していることがあります。
switch (menu) {
case 1:
std::cout << "新規作成";
break;
case 2:
std::cout << "開く";
break;
case 3:
std::cout << "終了";
break;
default:
std::cout << "無効な選択";
break;
}
一般的な使い分けは次のとおりです。
| 状況 | 適した構文 |
|---|---|
| 数値の範囲を判定する | if、else if |
| 複雑な条件を組み合わせる | if、else if |
| 1つの値を複数の定数と比較する | switch |
std::stringを比較する | if、else if |
標準的なswitch文では、std::stringを直接条件に使用できません。
よくある間違い
条件の順番を間違える
if (score >= 60) {
std::cout << "合格";
} else if (score >= 80) {
std::cout << "優秀";
}
80点以上でも最初の条件が成立するため、「優秀」は表示されません。
正しくは、条件の厳しいものから書きます。
if (score >= 80) {
std::cout << "優秀";
} else if (score >= 60) {
std::cout << "合格";
}
==ではなく=を使う
if (answer = 1) {
// 比較ではなく代入
}
正しくは次のとおりです。
if (answer == 1) {
// 1と等しいかを比較
}
ifの直後にセミコロンを付ける
if (score >= 60); {
std::cout << "合格";
}
ifの直後のセミコロンが空文として扱われるため、「合格」は条件に関係なく表示されます。
正しくは次のとおりです。
if (score >= 60) {
std::cout << "合格";
}
範囲判定を数学のように書く
if (0 < x < 10) {
// 正しい範囲判定にならない
}
正しくは次のとおりです。
if (0 < x && x < 10) {
std::cout << "xは0より大きく10未満です";
}
&&と||を間違える
if (number >= 1 || number <= 10) {
std::cout << "範囲内";
}
正しくは次のとおりです。
if (number >= 1 && number <= 10) {
std::cout << "範囲内";
}
実践例:料金を判定するプログラム
年齢によって料金を変える
#include <iostream>
int main() {
int age = 0;
int price = 0;
std::cout << "年齢を入力してください: ";
if (!(std::cin >> age)) {
std::cout << "数値を入力してください\n";
return 1;
}
if (age < 0) {
std::cout << "年齢が正しくありません\n";
return 1;
} else if (age <= 5) {
price = 0;
} else if (age <= 12) {
price = 500;
} else if (age <= 64) {
price = 1000;
} else {
price = 700;
}
std::cout << "入場料金は" << price << "円です\n";
return 0;
}
料金区分は次のとおりです。
| 年齢 | 料金 |
|---|---|
| 0〜5歳 | 0円 |
| 6〜12歳 | 500円 |
| 13〜64歳 | 1,000円 |
| 65歳以上 | 700円 |
入力時に数値以外が入力された場合は、次の条件でエラーを検出します。
if (!(std::cin >> age)) {
std::cout << "数値を入力してください\n";
return 1;
}
実践例:ログイン判定
ユーザー名とパスワードを判定する
#include <iostream>
#include <string>
int main() {
std::string userName;
std::string password;
std::cout << "ユーザー名: ";
std::cin >> userName;
std::cout << "パスワード: ";
std::cin >> password;
if (userName == "admin" && password == "1234") {
std::cout << "管理者としてログインしました\n";
} else if (userName == "guest" && password == "guest") {
std::cout << "ゲストとしてログインしました\n";
} else if (userName == "admin") {
std::cout << "パスワードが違います\n";
} else {
std::cout << "ユーザー名またはパスワードが違います\n";
}
return 0;
}
最初にユーザー名とパスワードの両方を確認し、その後でユーザー名だけを確認しています。
条件の範囲が狭いものから順番に書くことで、意図した判定ができます。
実際のシステムでは、パスワードをソースコード内に直接記述せず、安全なハッシュ方式を使って管理します。
読みやすい条件分岐を書く方法
深いネストを避ける
次のコードは、条件が深く入れ子になっています。
if (userExists) {
if (passwordCorrect) {
if (accountActive) {
std::cout << "ログイン成功";
} else {
std::cout << "アカウントが無効";
}
} else {
std::cout << "パスワードが違う";
}
} else {
std::cout << "ユーザーが存在しない";
}
異常な条件を先に処理すると、コードを整理できます。
if (!userExists) {
std::cout << "ユーザーが存在しない";
return 1;
}
if (!passwordCorrect) {
std::cout << "パスワードが違う";
return 1;
}
if (!accountActive) {
std::cout << "アカウントが無効";
return 1;
}
std::cout << "ログイン成功";
このように、処理を続けられない条件を先に確認する書き方を、ガード節と呼ぶことがあります。
複雑な条件に名前を付ける
条件が長くなる場合は、bool型の変数に分けると読みやすくなります。
if (age >= 18 && hasLicense && !isSuspended && carAvailable) {
std::cout << "運転できます";
}
条件ごとに名前を付けると、意味を把握しやすくなります。
bool isAdult = age >= 18;
bool hasValidLicense = hasLicense && !isSuspended;
bool canDrive = isAdult && hasValidLicense && carAvailable;
if (canDrive) {
std::cout << "運転できます";
}
条件式の中で値を変更しすぎない
次のコードは動作しますが、条件判定と値の変更が同時に行われています。
if (++count > 10) {
std::cout << "上限を超えました";
}
処理を分けると、意図が明確になります。
++count;
if (count > 10) {
std::cout << "上限を超えました";
}
比較時に注意したい型
符号付き整数と符号なし整数
符号付き整数と符号なし整数を比較すると、意図しない結果になる場合があります。
int value = -1;
unsigned int limit = 10;
if (value < limit) {
std::cout << "valueはlimitより小さい";
}
比較時にvalueが符号なし整数へ変換されると、非常に大きな正の値として扱われる可能性があります。
比較する値の型は、できるだけそろえます。
int value = -1;
int limit = 10;
if (value < limit) {
std::cout << "valueはlimitより小さい";
}
浮動小数点数の比較
doubleなどの浮動小数点数は、計算誤差によって完全に一致しないことがあります。
double value = 0.1 + 0.2;
if (value == 0.3) {
std::cout << "等しい";
}
差が十分に小さいかどうかを確認する方法があります。
#include <cmath>
double value = 0.1 + 0.2;
if (std::abs(value - 0.3) < 1e-9) {
std::cout << "ほぼ等しい";
}
まとめ
C++のelse if文は、複数の条件から1つの処理を選択するときに使用します。
基本形は次のとおりです。
if (条件1) {
// 条件1が成立した場合
} else if (条件2) {
// 条件1が不成立で、条件2が成立した場合
} else {
// どの条件も成立しなかった場合
}
重要なポイントは次のとおりです。
- 条件は上から順番に評価される
- 最初に成立した処理だけが実行される
- 条件の順番によって結果が変わる
- 複数の
if文はそれぞれ独立して評価される - 比較には
==を使い、代入の=と区別する - 複数条件には
&&や||を使う - 数値の範囲は
0 < x && x < 10のように書く - 波かっこを付けるとミスを防ぎやすい
- 深いネストはガード節などで整理できる
else if文を正しく使うには、条件がどの順番で評価され、どの範囲を表しているのかを意識することが大切です。
以上、C++のelse if文についてでした。
最後までお読みいただき、ありがとうございました。
