[C++] if文での条件式の書き方

C++のif文は、条件式がtrueの場合に特定のコードブロックを実行するために使用されます。

条件式は丸括弧()で囲まれ、論理演算子や比較演算子を用いて評価されます。

例えば、if (x > 0)のように記述し、xが0より大きい場合に続くブロックを実行します。

また、elseelse ifを組み合わせることで、複数の条件を扱うことが可能です。

条件式には、==!=&&||などの演算子が使用されます。

この記事でわかること
  • 比較演算子と論理演算子を用いた条件式の書き方
  • if文の応用例として、ネストされたif文やswitch文との使い分け
  • よくあるエラーの原因とその対処法

目次から探す

条件式の書き方

C++における条件式は、プログラムの流れを制御するための重要な要素です。

ここでは、条件式の書き方について詳しく解説します。

比較演算子の使用

比較演算子は、2つの値を比較して真(true)または偽(false)を返します。

以下に、主な比較演算子を紹介します。

等価演算子と不等価演算子

  • == : 等価演算子は、2つの値が等しいかどうかを比較します。
  • != : 不等価演算子は、2つの値が等しくないかどうかを比較します。
#include <iostream>
int main() {
    int a = 5;
    int b = 10;
    // 等価演算子の例
    if (a == b) {
        std::cout << "aとbは等しい" << std::endl;
    } else {
        std::cout << "aとbは等しくない" << std::endl;
    }
    // 不等価演算子の例
    if (a != b) {
        std::cout << "aとbは等しくない" << std::endl;
    }
    return 0;
}
aとbは等しくない
aとbは等しくない

この例では、変数abが等しくないため、両方の条件式で「aとbは等しくない」が出力されます。

大小比較演算子

  • < : 小なり演算子は、左辺が右辺より小さいかどうかを比較します。
  • > : 大なり演算子は、左辺が右辺より大きいかどうかを比較します。
  • <= : 小なりイコール演算子は、左辺が右辺以下かどうかを比較します。
  • >= : 大なりイコール演算子は、左辺が右辺以上かどうかを比較します。
#include <iostream>
int main() {
    int x = 7;
    int y = 10;
    // 大小比較演算子の例
    if (x < y) {
        std::cout << "xはyより小さい" << std::endl;
    }
    if (x > y) {
        std::cout << "xはyより大きい" << std::endl;
    }
    if (x <= y) {
        std::cout << "xはy以下" << std::endl;
    }
    if (x >= y) {
        std::cout << "xはy以上" << std::endl;
    }
    return 0;
}
xはyより小さい
xはy以下

この例では、xyより小さいため、「xはyより小さい」と「xはy以下」が出力されます。

論理演算子の使用

論理演算子は、複数の条件を組み合わせるために使用されます。

AND演算子

  • && : AND演算子は、両方の条件が真である場合にのみ真を返します。
#include <iostream>
int main() {
    int a = 5;
    int b = 10;
    // AND演算子の例
    if (a < b && b > 0) {
        std::cout << "aはbより小さく、bは0より大きい" << std::endl;
    }
    return 0;
}
aはbより小さく、bは0より大きい

この例では、両方の条件が真であるため、メッセージが出力されます。

OR演算子

  • || : OR演算子は、いずれかの条件が真であれば真を返します。
#include <iostream>
int main() {
    int a = 5;
    int b = 10;
    // OR演算子の例
    if (a > b || b > 0) {
        std::cout << "aはbより大きい、またはbは0より大きい" << std::endl;
    }
    return 0;
}
aはbより大きい、またはbは0より大きい

この例では、b > 0が真であるため、メッセージが出力されます。

NOT演算子

  • ! : NOT演算子は、条件の真偽を反転させます。
#include <iostream>
int main() {
    bool isTrue = false;
    // NOT演算子の例
    if (!isTrue) {
        std::cout << "isTrueはfalse" << std::endl;
    }
    return 0;
}
isTrueはfalse

この例では、isTruefalseであるため、NOT演算子によって条件が真となり、メッセージが出力されます。

複数条件の組み合わせ

複数の条件を組み合わせることで、より複雑な条件式を作成できます。

AND演算子やOR演算子を組み合わせて使用します。

#include <iostream>
int main() {
    int age = 20;
    bool hasLicense = true;
    // 複数条件の組み合わせの例
    if (age >= 18 && hasLicense) {
        std::cout << "運転が可能です" << std::endl;
    }
    return 0;
}
運転が可能です

この例では、年齢が18歳以上であり、かつ運転免許を持っている場合に「運転が可能です」と出力されます。

条件式の優先順位

条件式の中で演算子の優先順位を理解することは重要です。

優先順位が異なる演算子を組み合わせる場合、括弧を使用して明示的に優先順位を指定することができます。

#include <iostream>
int main() {
    int a = 5;
    int b = 10;
    int c = 15;
    // 条件式の優先順位の例
    if (a < b && b < c || a == 5) {
        std::cout << "条件式は真です" << std::endl;
    }
    return 0;
}
条件式は真です

この例では、a < b && b < cが真であるため、全体の条件式が真となり、メッセージが出力されます。

AND演算子がOR演算子よりも優先されるため、括弧を使用して優先順位を明示することができます。

if文の応用例

C++のif文は、条件に基づいてプログラムの流れを制御するための基本的な構造ですが、応用することでより複雑なロジックを実現できます。

ここでは、if文の応用例をいくつか紹介します。

ネストされたif文

ネストされたif文とは、if文の中にさらにif文を含めることを指します。

これにより、複数の条件を段階的に評価することができます。

#include <iostream>
int main() {
    int score = 85;
    // ネストされたif文の例
    if (score >= 60) {
        std::cout << "合格です" << std::endl;
        if (score >= 80) {
            std::cout << "優秀な成績です" << std::endl;
        }
    } else {
        std::cout << "不合格です" << std::endl;
    }
    return 0;
}
合格です
優秀な成績です

この例では、スコアが60以上であれば「合格です」と出力され、さらに80以上であれば「優秀な成績です」と出力されます。

switch文との違いと使い分け

switch文は、特定の変数の値に基づいて複数の分岐を行う場合に使用されます。

if文と異なり、switch文は整数型や列挙型の値に対してのみ使用できます。

#include <iostream>
int main() {
    int day = 3;
    // switch文の例
    switch (day) {
        case 1:
            std::cout << "月曜日" << std::endl;
            break;
        case 2:
            std::cout << "火曜日" << std::endl;
            break;
        case 3:
            std::cout << "水曜日" << std::endl;
            break;
        default:
            std::cout << "不明な曜日" << std::endl;
    }
    return 0;
}
水曜日

switch文は、特定の値に対する処理を簡潔に記述できるため、条件が多い場合にif文よりも読みやすくなります。

三項演算子との比較

三項演算子(条件演算子)は、簡単な条件分岐を1行で記述するために使用されます。

条件 ? 真の場合の値 : 偽の場合の値という形式です。

#include <iostream>
int main() {
    int a = 5;
    int b = 10;
    // 三項演算子の例
    int max = (a > b) ? a : b;
    std::cout << "最大値は " << max << std::endl;
    return 0;
}
最大値は 10

この例では、abのうち大きい方の値をmaxに代入しています。

三項演算子は、短い条件分岐を簡潔に記述するのに適しています。

条件式に関数を使用する

if文の条件式には、関数を使用することもできます。

これにより、条件の評価を関数に委ねることができます。

#include <iostream>
// 偶数かどうかを判定する関数
bool isEven(int number) {
    return number % 2 == 0;
}
int main() {
    int num = 4;
    // 関数を使用した条件式の例
    if (isEven(num)) {
        std::cout << num << "は偶数です" << std::endl;
    } else {
        std::cout << num << "は奇数です" << std::endl;
    }
    return 0;
}
4は偶数です

この例では、isEven関数を使用して、数値が偶数かどうかを判定しています。

条件式に変数を使用する

if文の条件式には、変数を直接使用することもできます。

変数が真(非ゼロ)であれば条件は真と評価されます。

#include <iostream>
int main() {
    int flag = 1; // 真を表す
    // 変数を使用した条件式の例
    if (flag) {
        std::cout << "フラグは真です" << std::endl;
    } else {
        std::cout << "フラグは偽です" << std::endl;
    }
    return 0;
}
フラグは真です

この例では、flagが非ゼロであるため、条件式は真と評価され、「フラグは真です」が出力されます。

変数を条件式に使用することで、プログラムの状態に応じた分岐を簡単に実現できます。

よくあるエラーとその対処法

C++のif文を使用する際には、いくつかの一般的なエラーが発生することがあります。

ここでは、よくあるエラーとその対処法について解説します。

セミコロンの誤用

if文の条件式の後に誤ってセミコロンを付けてしまうと、意図しない動作を引き起こすことがあります。

セミコロンは文の終わりを示すため、if文の条件式の後に付けると、if文が空の文として扱われます。

#include <iostream>
int main() {
    int a = 5;
    int b = 10;
    // セミコロンの誤用例
    if (a < b); {
        std::cout << "aはbより小さい" << std::endl;
    }
    return 0;
}
aはbより小さい

この例では、セミコロンのためにif文が空の文として扱われ、ブロック内のコードが常に実行されます。

対処法として、条件式の後にセミコロンを付けないように注意しましょう。

ブロックの省略によるエラー

if文のブロックを省略すると、if文の直後の1行だけが条件に基づいて実行されます。

複数の文を条件に基づいて実行したい場合は、ブロックを明示的に指定する必要があります。

#include <iostream>
int main() {
    int a = 5;
    int b = 10;
    // ブロックの省略によるエラー例
    if (a < b)
        std::cout << "aはbより小さい" << std::endl;
        std::cout << "この行は常に実行されます" << std::endl;
    return 0;
}
aはbより小さい
この行は常に実行されます

この例では、2行目の出力が条件に関係なく常に実行されます。

対処法として、複数の文を条件に基づいて実行する場合は、ブロックを使用して明示的に囲みます。

if (a < b) {
    std::cout << "aはbより小さい" << std::endl;
    std::cout << "この行も条件に基づいて実行されます" << std::endl;
}

論理演算子の誤用

論理演算子を誤って使用すると、意図しない条件評価を引き起こすことがあります。

特に、&&||の優先順位を誤解すると、条件式が正しく評価されないことがあります。

#include <iostream>
int main() {
    int a = 5;
    int b = 10;
    int c = 15;
    // 論理演算子の誤用例
    if (a < b || b < c && a == 5) {
        std::cout << "条件式は真です" << std::endl;
    }
    return 0;
}
条件式は真です

この例では、&&||よりも優先されるため、b < c && a == 5が先に評価されます。

意図した評価順序を確保するためには、括弧を使用して優先順位を明示することが重要です。

if ((a < b || b < c) && a == 5) {
    std::cout << "条件式は真です" << std::endl;
}

このように、括弧を使用することで、条件式の評価順序を明確にし、誤用を防ぐことができます。

よくある質問

if文とswitch文はどちらを使うべき?

if文とswitch文はどちらも条件分岐を行うための構文ですが、使用する場面が異なります。

  • if文は、複雑な条件式や範囲を扱う場合に適しています。

例えば、if (x > 10 && x < 20)のように、複数の条件を組み合わせて評価することができます。

  • switch文は、特定の値に基づいて分岐を行う場合に適しています。

特に、整数や列挙型の値に対して多くの分岐がある場合に、コードが簡潔になります。

例:switch (value) { case 1: ... }のように、特定の値に対する処理を簡潔に記述できます。

複数の条件をif文でどうやって扱うの?

複数の条件をif文で扱うには、論理演算子を使用して条件を組み合わせます。

  • AND演算子 (&&): すべての条件が真である場合に真を返します。
  • OR演算子 (||): いずれかの条件が真である場合に真を返します。

例:if (a > 0 && b < 10)のように、aが0より大きく、かつbが10より小さい場合に条件が真となります。

if文の中で変数を宣言してもいいの?

if文の中で変数を宣言することは可能ですが、注意が必要です。

if文のブロック内で宣言された変数は、そのブロックのスコープ内でのみ有効です。

例:if (condition) { int x = 5; }のように、xはif文のブロック内でのみ使用可能です。

このため、if文の外で変数を使用する必要がある場合は、if文の外で変数を宣言しておくことをお勧めします。

これにより、変数のスコープを明確にし、意図しないエラーを防ぐことができます。

まとめ

この記事では、C++におけるif文の条件式の書き方や応用例、よくあるエラーとその対処法について詳しく解説しました。

if文を正しく活用することで、プログラムの流れを効果的に制御し、より複雑なロジックを実現することが可能です。

この記事を参考に、実際のプログラムでif文を活用し、より効率的で読みやすいコードを書くことに挑戦してみてください。

当サイトはリンクフリーです。出典元を明記していただければ、ご自由に引用していただいて構いません。

関連カテゴリーから探す

  • 条件分岐 (11)
  • 繰り返し処理 (11)
  • URLをコピーしました!
目次から探す