5.

C++のif文の使い方|条件分岐・else if・三項演算子

編集

C++のif文は、指定した条件が真(true)か偽(false)かによって実行する処理を切り替える、条件分岐の基本となる制御構文です。if (条件) { 真のときの処理 } の形で書き、条件が成り立つ場合だけブロック内が実行されます。elseelse if を組み合わせることで、複数の分かれ道を表現できます。

この記事の要点
  • if文は条件式が true のときだけ { } 内の処理を実行する。
  • 条件が偽のときの処理は else、別条件の追加は else if で書く。
  • 条件には == != < > <= >= などの比較演算子を使う。
  • 複数条件を &&(かつ)や ||(または)でつなぐ方法は if文の論理演算子 を参照。
  • 条件式は bool に変換され、0 以外の数値や非nullポインタは true とみなされる。
  • 代入 = と比較 == の取り違えは典型的なバグの原因になる。

 

if文の基本構文

もっとも単純なif文は、条件が真のときだけ処理を行う形です。条件式は丸括弧 ( ) で囲み、実行する処理は波括弧 { } のブロックにまとめます。

#include <iostream>

int main() {

    int score = 80;

    if (score >= 60) {

        std::cout << "合格" << std::endl;

    }

}

 

この例では score60 以上のときだけ「合格」と表示されます。条件式 score >= 60 の評価結果は truefalse のいずれかになり、true の場合だけ直後の波括弧で囲まれたブロックが実行されます。false のときは何も起こらず、if文の次の行へ処理が進みます。

条件が偽のときにも別の処理を行いたい場合は、else を続けて書きます。else には条件を書かず、「if の条件が成り立たなかったすべての場合」を受け持ちます。

    if (score >= 60) {

        std::cout << "合格";

    } else {

        std::cout << "不合格";

    }

 

条件が成立すれば if 側のブロック、成立しなければ else 側のブロックが実行され、必ずどちらか一方だけが動きます。

else ifで複数の条件を分岐する

3通り以上に分けたい場合は else if を重ねます。上から順に条件が評価され、最初に true になったブロックだけが実行されます。それ以降の条件は評価されません。

    int score = 75;

    if (score >= 90) {

        std::cout << "優";

    } else if (score >= 70) {

        std::cout << "良";

    } else if (score >= 60) {

        std::cout << "可";

    } else {

        std::cout << "不可";

    }

 

上の例で score75 の場合、最初の score >= 90 は偽、次の score >= 70 が真となるため「良」が表示されます。一度どこかの条件が真になると、それ以降の else ifelse は評価されずに飛ばされる点が重要です。条件の順序を「大きい値から」整理しておくと、意図しない分岐を防ぎやすくなります。たとえば score >= 60 を先頭に置いてしまうと、90点でも70点でも最初の条件で止まり、すべて「可」になってしまいます。

比較演算子の一覧

if文の条件式では、2つの値を比べる比較演算子がよく使われます。結果は必ず bool 型(true または false)になります。

演算子 意味 例(aが3のとき) 結果
== 等しい a == 3 true
!= 等しくない a != 3 false
< より小さい a < 5 true
> より大きい a > 5 false
<= 以下(小さいか等しい) a <= 3 true
>= 以上(大きいか等しい) a >= 4 false

 

「等しい」を判定するのは = ではなく == です。= は代入演算子であり、意味がまったく異なります。この取り違えは後述の落とし穴で詳しく扱います。

なお、&&(かつ)や ||(または)、!(否定)といった論理演算子で複数の条件を組み合わせる方法は、別記事の if文の論理演算子 で詳しく解説しています。

波括弧の省略

処理が1文だけのときは波括弧 { } を省略でき、if (条件) 処理; のように書けますが、行を追加した際にバグを招きやすいため、原則として波括弧は省略せず常に付けることが推奨されます。

    // 省略形(1文のみ有効)

    if (x > 0) std::cout << "正の数";

 

    // 推奨:常に波括弧を付ける

    if (x > 0) {

        std::cout << "正の数";

    }

 

三項演算子(条件演算子)

「条件によって値を選ぶ」だけの単純な分岐は、三項演算子 ?: で1行に書けます。条件 ? 真のときの値 : 偽のときの値 という形で、式として値を返すのが特徴です。

    int a = 5, b = 8;

    int max = (a > b) ? a : b;  // 大きい方をmaxへ

    std::cout << max;  // 8

 

これは if/elsea > b なら max = a、そうでなければ max = b と書くのと同じ結果になります。短く書ける反面、分岐の中で複数の処理を行う場合や条件が複雑な場合は、可読性のため通常のif文を使う方が適しています。

C++17のif初期化文

C++17以降では、条件を評価する前に変数を初期化できる「if初期化文」が使えます。if (初期化; 条件) という形で、セミコロンの前で宣言した変数はその ifelse のブロック内でのみ有効になります。

    if (auto x = compute(); x > 0) {

        std::cout << x;  // ここでxが使える

    }

    // ここではxは使えない(スコープ外)

 

変数の有効範囲(スコープ)を条件分岐の内側に限定できるため、関数を呼んだ戻り値をその場で判定するような場面で、不要な変数の漏れを防げます。同じ名前の変数を別の場所でも使いたいときに、名前の衝突を避けやすくなる利点もあります。

if文のネストと早期returnによる整理

if文の中にさらにif文を書く「ネスト(入れ子)」も可能です。ただし入れ子が深くなるほどコードは読みにくくなります。条件を満たさない場合に早めに処理を打ち切る「早期return」を使うと、ネストを浅く保てます。

    // ネストが深い書き方

    if (ok) {

        if (n > 0) {

            process(n);

        }

    }

 

    // 早期returnで平坦化

    if (!ok) return;

    if (n <= 0) return;

    process(n);

 

どちらも結果は同じですが、後者は「処理を続ける条件」が上から並ぶため、読み手が把握しやすくなります。関数の冒頭で前提条件をチェックして弾く書き方は「ガード節」とも呼ばれ、可読性を高める定番の手法です。

つまずきやすい落とし穴

注意点 内容
=== の取り違え if (x = 5) は「xに5を代入し、その結果(5)を条件とする」ため常に真になります。比較は必ず == を使います。多くのコンパイラは警告を出します。
波括弧省略によるバグ 波括弧を省いたifに後から行を足すと、その行はif条件と無関係に常に実行されてしまいます。インデントが揃っていても結びつきません。
条件はboolに変換される 条件式の値は bool に変換され、0 以外の数値やnullでないポインタは true 扱いです。if (ptr) はポインタがnullでないかの判定になります。
浮動小数点数の等値比較 double などは誤差を含むため == での比較が意図通りにならないことがあります。差の絶対値が十分小さいかで判定するのが安全です。

 

とくに === の取り違えは、コンパイルが通ってしまうぶん発見が遅れがちです。コンパイラの警告を有効にしておくことが有効な対策になります。

動作する完全なコード例

#include <iostream>

int main() {

    int n = 7;

    if (n % 2 == 0) {

        std::cout << n << " は偶数" << std::endl;

    } else {

        std::cout << n << " は奇数" << std::endl;

    }

    return 0;

}

 

出力結果

7 は奇数

 

よくある質問(FAQ)

Q. if文と三項演算子はどちらを使うべきですか?

条件によって1つの値を選ぶだけならば三項演算子が簡潔です。一方、分岐の中で複数の処理を行う場合や、条件が複雑で読みにくくなる場合は、通常のif文の方が可読性に優れます。迷ったときはif文を選ぶと無難です。

Q. else ifはいくつまで連ねられますか?

文法上の上限はなく、必要なだけ else if を連ねられます。ただし数が多くなると見通しが悪くなるため、整数値や列挙型を分岐の起点にする場合は switch 文への置き換えを検討すると整理しやすくなります。

Q. 条件式に数値をそのまま書くとどうなりますか?

if (n) のように書くと、n0 なら偽、0 以外なら真と判定されます。意図が伝わりにくいため、if (n != 0) のように比較演算子で明示する書き方が読みやすくなります。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. コメントアウト
  2. 文字列の結合/連結
  3. 変数の宣言
  4. 定数の宣言
  5. if文
  6. if文の論理演算子
  7. for文
  8. データ型(文字列以外)
  9. データ型(文字列)
  10. 配列とfor文
  11. 配列の要素数
  12. 多次元配列とfor文
  13. 多次元配列の要素数
  14. 関数の定義と呼び出し

最近更新/作成されたページ