☜前の章へ 計算の基本と四則演算や演算子の使い方
☞次の章へ ループ処理をしてみよう
- 条件分岐とは
 - if文で条件分岐する方法
 - else ifで条件分岐する方法
 - switch文で条件分岐する方法
 - 関係演算子の使い方
 - 論理演算子の使い方
 - ネストについて
 
条件分岐とは、例えば条件Aを設定して、その条件に当てはまるのであれば、処理Xを実行して、そうでなければ処理Yを実行するといった様に、条件によって処理を変えるものです。
C言語の条件分岐とは
例えば、どのような条件があるのかを考えてみます。
年齢制限のあるアプリがあるとします。年齢制限をするためには、年齢を条件にする必要があります。
この時の条件として考えられる例として以下のものがあります。
- 20歳以上ならば使用可能
 - 20歳未満なら使用不可能
 
20歳以上なら条件に当てはまることになります。
条件に当てはまることを、「真」や「true」と言います。
条件に当てはまらないことを、「偽」や「false」と言います。
会話での使い方は以下の通りです。
「この条件はtrueだよね」
先ほどの条件以外にも、特定の年齢の人だけが使用できるようにする条件も指定できます。
- 20歳のみ使用可能
 
プログラミングではこのように条件を指定して、その後の処理を分岐させていきます。
C言語のif文で条件分岐をする方法
C言語のif文の基本的な書き方
まずは、C言語で条件分岐をどのように行うのかをサンプルのソースコードで確認してみましょう。
#include <stdio.h>
int main(void) {
    int num = 5;
    if(num == 5) {
        printf("numは%dです。", num);
    } else {
        printf("numは5ではありません。");
    }
    return 0;
}出力結果

このif文はnumが5の場合(真/true)、「numは5です。」と表示し、numが5ではない場合(偽/false)、「numは5ではありません。」と表示するようになっています。
以下のソースコードが条件式です。
if(num == 5)「もし変数numが5ならば」という条件になっています。
=(イコール)が2つ連続で書かれており、「==」となっています。
これは「等しい」という意味になります。
elseは「条件に当てはまらないならば」という意味です。
elseの後に条件に当てはまらなかった場合の処理を書きます。elseは省略可能です。
C言語の関係演算子の使い方
先ほど「==」この記号は等しいを意味すると解説しました。
この記号は関係演算子と言います。
他の条件を指定したい場合は、他の関係演算子を使う必要があります。
関係演算子とその使い方を見ていきましょう。
関係演算子
| 演算子 | 記述例 | 意味 | 
| == | a == b | aとbは等しい | 
| != | a != b | aとbは等しくない | 
| > | a > b | aはbより大きい | 
| >= | a >= b | aはb以上 | 
| < | a < b | aより小さい | 
| <= | a <= b | aはb以下 | 
実際の使い方を見ていきましょう。
#include <stdio.h>
int main(void) {
    int num = 5;
    if (num == 5) {
        printf("numと5は等しいです。\n");
    }
    if (num != 3) {
        printf("numと3は等しくないです。\n");
    }
    if (num > 4) {
        printf("numは4より大きいです。\n");
    }
    if (num >= 5) {
        printf("num5以上です。\n");
    }
    if (num < 6) {
        printf("numは6より小さいです。\n");
    }
    if (num <= 5) {
        printf("numは5以下です。\n");
    }
    return 0;
}この様に、関係演算子を使うことで、値を比較し、条件分岐を発生させることができます。
C言語の論理演算子の使い方
続いて、論理演算子を見ていきましょう。
これまでは、条件は1つだけでしたが、複数の条件を指定したい場合と条件を反転させたい場合に論理演算子を使います。
例えば、変数a、b、cがあった場合のことを考えてみます。
「aはbと等しいかつaはcとも等しい」という条件が作れそうです。
この「かつ」に当たる部分を論理演算子で表します。
論理演算子
| 演算子 | 概要 | 記述例 | 意味 | 
| && | かつ(AND) | a == b && a == c | aとbは等しく、aとcも等しい場合、条件に合致 | 
| || | または(OR) | a == b || a == c | aとb、aとc、どちらか1つでも等しい場合、条件に合致 | 
| ! | でない(NOT) | !(a == b) | aとbが等しいという条件を反転させた条件(aとbは等しくない)に合致 | 
実際の使い方を見てみましょう。
#include <stdio.h>
int main(void)
{
    int a = 5;
    int b = 5;
    int c = 5;
    if (a == b && a == c) {
        printf("aとbは等しく、aとcも等しいです。\n");
    }
    if (a == b || a == 3) {
        printf("aはbと等しい、またはaは3です。\n");
    }
    if (!(a == 3)) {
        printf("aは3ではありません。\n");
    }
    return 0;
}出力結果

「if (!(a == 3))」という条件式は、a==3という条件を反転させるため、aが3ではない場合trueという意味になります。
この様に、論理演算子を使うことで、複数の条件を指定したり、条件を反転させることができます。
C言語のelse ifで条件分岐をする方法
これまで学んだif文は条件が1つ判定されるだけでしたが、条件はelse ifを使うことで何個でも追加することができます。
#include <stdio.h>
int main(void)
{
    int num = 5;
    if(num == 6) {
        printf("numは6です。\n");
    } else if(num == 7) {
        printf("numは7です。\n");
    } else if(num == 5) {
        printf("numは5です。\n");
    }
    return 0;
}出力結果

処理の動きは次の通りです。
numが6に等しいという条件に合致しませんでした。
次のnumが7に等しいという条件にも合致しませんでした。
次のnumが5に等しいという条件に合致したので「numは5です。」と表示されました。
このようにelse ifを使えば、条件を追加することが出来ます。
C言語のネスト(入れ子)をする方法
これまでの条件分岐では、1つの条件に合致したら処理が終了していました
しかし、条件の中に条件を入れることで複数の処理を行うことができます。
これをネスト(入れ子)と言います。
#include <stdio.h>
int main(void)
{
    int num = 5;
    if (num == 5) {
        printf("numは5です。\n");
        if (num == 6) {
            printf("numは6です。\n");
        } else {
            printf("numは6ではありません。\n");
        }
    }
    return 0;
}出力結果

このようにネストでは、条件の中に条件を追加することができます。
C言語のswitch文で条件分岐をする方法
switch文は、ある変数と複数の値を比較したい場合に使われます。
#include <stdio.h>
int main(void)
{
    int num = 5;
    switch (num) {
        case 2:
            printf("numは2です。\n");
            break;
        case 5:
            printf("numは5です。\n");
            break;
        default:
            printf("不正な値です。\n");
    }
    return 0;
}出力結果

この場合は、numが2と5と比較されます。
「case 2」は「numが2の場合」という意味になります。
numは5なので、出力結果は「numは5です。」となりました。
switch(num)と書かれている括弧の中には、条件式を書くこともできます。
例えば、(num – 3) と書いた場合、「numは2です。」と表示されます。
defaultには、どのケースにも当てはまらなかった場合の処理を書きます。
練習問題
- キーボードから年齢を入力
 - 18歳未満の場合、「未成年です。」と表示
 - 18歳以上の場合、「成人です。」と表示
 
#include <stdio.h>
int main() {
    int age;
    printf("年齢を入力してください。\n");
    scanf("%d", &age);
    if(age < 18) {
        printf("未成年です。\n");
    } else {
        printf("成人です。\n");
    }
    
    return 0;
}出力結果

- キーボードから0から100の整数を2回入力
 - 入力値が5かつ55の場合「大当たり!」と表示
 - 入力値が15または25または100の場合「当たり!」と表示
 - それ以外は「ハズレ…」と表示
 
#include <stdio.h>
int main() {
    int num_a;
    int num_b;
    printf("0~100の整数を2回入力してください。\n");
    scanf("%d%d", &num_a, &num_b);
    if(num_a == 5 && num_b == 55 || num_a == 55 && num_b == 5) {
        printf("大当たり!\n");
    } else if(num_a == 15 && num_b == 25 || num_a == 25 && num_b == 15) {
        printf("当たり!\n");
    } else {
        printf("ハズレ...\n");
    }
        
    return 0;
    
}出力結果

- キーボードからLまたはRを入力
 - 入力値がLの場合、再度キーボードからLまたはRを入力
 - 入力値がRの場合、「残念、行き止まりです・・・」と表示
 - 2回目の入力値がLの場合、「おめでとうございます!ゴールです!」と表示
 - 入力値がRの場合、「残念、行き止まりです・・・」と表示
 
解答例1
#include <stdio.h>
int main() {
    char lr;
    printf("LまたはRを入力してください。\n");
    scanf("%c", &lr);
    if(lr == 'l' || lr == 'L') {
        printf("再度LまたはRを入力してください。\n");
        scanf(" %c", &lr);
        if(lr == 'l' || lr == 'L') {
            printf("おめでとうございます!ゴールです!\n");
        } else {
            printf("残念、行き止まりです・・・\n");
        }
    } else {
        printf("残念、行き止まりです・・・\n");
    }
    
    return 0;
}出力結果



