はじめに:プログラムに「判断力」を持たせる
これまでのプログラムは、上から下へ決められた命令を順番に実行するだけでした。しかし、より実用的なプログラムを作るには、「もし○○だったらAを実行し、そうでなければBを実行する」というように、状況に応じて処理の流れを変える「条件分岐」の仕組みが不可欠です。
C++では、その中心的な役割をif
文が担います。この記事では、if
文の基本的な使い方から、条件を記述するために不可欠な各種演算子、そしてより複雑な分岐処理までを、サンプルコードを交えながら体系的に解説します。
if
文の基本:もし条件が真ならば実行する
if
文は、指定した条件が成立するかどうかを判定し、成立した場合(真 / true)にのみ、続く処理を実行します。
#include <iostream>
using namespace std;
int main() {
int score;
cout << "点数を入力してください: ";
cin >> score;
// もし score が 60 以上なら、合格メッセージを表示する
if (score >= 60) {
cout << "おめでとうございます!合格です。" << endl;
}
cout << "プログラムを終了します。" << endl;
return 0;
}
実行例(85と入力):
点数を入力してください: 85
おめでとうございます!合格です。
プログラムを終了します。
if
の後の( )
内に記述された条件式 score >= 60
が評価され、真であれば{ }
内の処理が実行されます。偽(false)の場合は{ }
内はスキップされます。
条件を作るための演算子
if
文の条件式では、値と値を比較するための関係演算子や等価演算子が頻繁に使われます。
関係演算子
2つの値の大小関係を比較します。
演算子 | 意味 |
< | 左辺が右辺より小さい |
> | 左辺が右辺より大きい |
<= | 左辺が右辺以下 |
>= | 左辺が右辺以上 |
等価演算子
2つの値が等しいか、または等しくないかを比較します。
演算子 | 意味 |
== | 左辺と右辺が等しい |
!= | 左辺と右辺が等しくない |
注意: 代入の=
と、等価比較の==
は全くの別物です。if (score = 60)
のように間違えると、意図しない動作の原因となるため、注意深く使い分けましょう。
else
とelse if
:分岐パターンを増やす
if-else
文:条件が偽の場合の処理
条件が成立しなかった場合(偽 / false)に実行したい処理がある場合は、else
を使います。
// if (score >= 60) の続き
if (score >= 60) {
cout << "合格です。" << endl;
} else {
cout << "残念ながら不合格です。再挑戦を期待します。" << endl;
}
これで、score
が60以上なら合格、そうでなければ不合格のメッセージが表示されるようになります。
else if
文:さらに多くの条件で分岐する
3つ以上の選択肢で分岐させたい場合は、else if
を使います。
if (score >= 80) {
cout << "評価:優" << endl;
} else if (score >= 60) {
cout << "評価:良" << endl;
} else if (score >= 40) {
cout << "評価:可" << endl;
} else {
cout << "評価:不可" << endl;
}
条件は上から順に判定され、最初に真となったブロックの処理が実行されると、残りのelse if
やelse
はすべてスキップされます。
複雑な条件を作る:論理演算子
「AかつB」や「AまたはB」のように、複数の条件を組み合わせて、より複雑な判定を行いたい場合は論理演算子を使います。
演算子 | 意味 | 説明 |
&& | 論理積 (AND) | 条件A && 条件B のように使い、AとBの両方が真のときだけ全体が真になる。 |
` | ` | |
! | 論理否定 (NOT) | !条件A のように使い、Aが真なら偽、偽なら真というように真偽を反転させる。 |
使用例:季節の判定
#include <iostream>
using namespace std;
int main() {
int month;
cout << "今は何月ですか? (1-12) : ";
cin >> month;
if (month >= 3 && month <= 5) {
cout << "春ですね。" << endl;
} else if (month >= 6 && month <= 8) {
cout << "夏ですね。" << endl;
} else if (month >= 9 && month <= 11) {
cout << "秋ですね。" << endl;
} else if (month == 12 || month == 1 || month == 2) {
cout << "冬ですね。" << endl;
} else {
cout << "1から12の範囲で入力してください。" << endl;
}
return 0;
}
短絡評価(ショートサーキット評価) 論理演算子には「短絡評価」という性質があります。
&&
: 左辺の条件が偽の場合、右辺の条件を評価するまでもなく全体が偽だと確定するため、右辺の評価は行われません。||
: 左辺の条件が真の場合、右辺の条件を評価するまでもなく全体が真だと確定するため、右辺の評価は行われません。 これは、プログラムの無駄な処理を省くための最適化の一環です。
その他の便利な演算子と構文
条件演算子(三項演算子)
if-else
文を非常に簡潔に書ける演算子です。
条件式 ? 式が真の場合の値 : 式が偽の場合の値
int a = 10, b = 20;
int maxValue;
// if文で書いた場合
if (a > b) {
maxValue = a;
} else {
maxValue = b;
}
// 条件演算子で書いた場合
maxValue = (a > b) ? a : b; // a > b が真なら a を、偽なら b を maxValue に代入
cout << "最大値は " << maxValue << " です。" << endl; // 結果は 20
ブロック(複合文)と変数のスコープ
{ }
で囲まれた部分はブロック(または複合文)と呼ばれ、複数の文を一つのまとまりとして扱います。if
やelse
の後で複数の処理を行いたい場合は、必ず{ }
で囲みます。
ブロック内で宣言された変数は、そのブロックの}
を抜けると消滅します。この変数が有効な範囲を「スコープ」と呼びます。
使用例:2つの値の入れ替え(ソート)
int x = 100, y = 50;
cout << "交換前: x = " << x << ", y = " << y << endl;
if (x > y) {
// このブロック内でのみ有効な一時変数 tmp を宣言
int tmp = x;
x = y;
y = tmp;
} // ここで tmp は消滅する
cout << "交換後: x = " << x << ", y = " << y << endl;
C++17以降のif
文:条件部での変数宣言
if
文の判定のためだけに一時的な変数が必要な場合、C++17からはif
の条件部で変数を宣言・初期化できるようになりました。変数のスコープがif-else
ブロック内に限定されるため、より安全なコードになります。
// if (初期化文; 条件式)
if (int result = someFunction(); result > 0) {
cout << "処理は成功しました。結果は " << result << " です。" << endl;
} else {
cout << "処理は失敗しました。" << endl;
}
// ここでは変数 result は使えない
まとめ
今回は、プログラムの流れを自在に操るための条件分岐について学びました。
if
,else if
,else
: 条件に応じて処理を分岐させる基本構文。- 関係・等価・論理演算子: 複雑な条件式を組み立てるための道具。
{ }
ブロック: 複数の処理をまとめ、変数の有効範囲(スコープ)を定める。- 条件演算子: 簡単な
if-else
を一行で書ける便利なショートカット。
これらの知識を組み合わせることで、プログラムは単なる命令の羅列から、状況を判断して動く知的なツールへと進化します。