【C言語入門】if文で条件分岐(else、AND/OR、否定、省略)

if文って使ってますか?普段の生活の中でもどちらかの選択によって行動が変わってくることってありますよね。

例えば、歩行者信号が青信号の場合は横断歩道を渡る。赤信号の場合は止まるなどです。C言語でも、条件によって処理を変えなければならない場合はよくあります。そんな場合に使用するのがif文です。

この記事では、if文について

  • if文の使い方
  • if else文で条件が複数の場合の記述方法
  • という基本的な文の構造の説明から、

  • “また”や”かつ”(OR・AND)で複数条件を処理
  • 等号・不等号(比較演算子)の使い方
  • if文とbreak文やcontinue文でループを制御

  • など、条件を判断する方法についても解説していきます。今回はif文について、使い方をわかりやすく解説します!

    目次

    if文の使い方

    if文は主に、2つの値の大小関係や、等しい・等しくないなどの条件により処理を変える場合に使われます。

    条件式が「true」の場合に{ }内の処理を行います。また、「false」の場合にはif文のブロック外に出るかもしくは「else」句の後の{ }内の処理を行います。
    以下のように記述します。

    if(条件式) {
        // 条件式がtrueの場合に実行する処理
    }

    それに対して、switch文も条件によって処理を変える場合に使われますが、switch文の場合はたくさんの条件に分かれる場合に使われます。

    例えば、サイコロの目は1から6までありますが、1から6までの出た目でそれぞれ処理が違う場合などです。if文の使い方についてサンプルコードで確認していきましょう。

    #include <stdio.h>
     
    int main(void) {
        int year = 2016; // うるう年
        
        if(year % 4 == 0) {
            printf("%d年はうるう年です!\n", year);
        }
        
        return 0;
    }

    実行結果:

    2016年はうるう年です!

    if else文で条件が複数の場合の記述方法

    if else文はif文の条件以外の場合に行う処理を記述します。以下のように記述します。

    if(条件式) {
        // 条件式がtrueの場合に実行する処理
    } else {
        // 条件式がfalseの場合に実行する処理
    }

    条件とは一致しないそれ以外の場合は「else」句を使用します。サンプルコードで確認しましょう。

    #include <stdio.h>
     
    int main(void) {
        int year;
        
        // うるう年の場合
        year = 2016; 
        
        if(year % 4 == 0) {
            printf("%d年はうるう年です!\n", year);
        } 
        else {
            printf("%d年はうるう年ではありません!\n", year);
        }
        
        // うるう年でない場合
        year = 2017; 
        
        if(year % 4 == 0) {
            printf("%d年はうるう年です!\n", year);
        } 
        else {
            printf("%d年はうるう年ではありません!\n", year);
        }
        
        return 0;
    }

    実行結果:

    2016年はうるう年です!
    2017年はうるう年ではありません!

    このサンプルコードでは、西暦年数が4で割り切れる場合は「うるう年です」と、それ以外の場合は「うるう年ではありません」と表示します。

    処理が1行の場合の{}の省略

    if文の処理が1行の場合は、{ }を省略して記述することができます。先ほどのサンプルコードでも処理が1行でしたので、以下のコードのように処理を省略して記述しても問題ありません。

    #include <stdio.h>
     
    int main(void) {
        int year;
        
        // うるう年の場合
        year = 2016; 
        
        if(year % 4 == 0) {
            printf("%d年はうるう年です!\n", year);
        } else {
            printf("%d年はうるう年ではありません!\n", year);
        }
        
        // うるう年でない場合
        year = 2017; 
        
        if(year % 4 == 0) printf("%d年はうるう年です!\n", year);
        else printf("%d年はうるう年ではありません!\n", year);
        
        return 0;
    }

    実行結果:

    2016年はうるう年です!
    2017年はうるう年ではありません!

    if文の入れ子(ネスト)の使い方

    if文の条件のなかで、さらに条件を追加したい場合があります。if文の条件のなかでさらに条件を追加することをif文の入れ子(ネスト)と言います。その記述方法についてサンプルコードで確認していきましょう。

    #include <stdio.h>
     
    int main(void) {
        int year;
        
        // うるう年の場合
        year = 2016; 
        
        if(year % 4 == 0) {
            printf("%d年はうるう年で、夏季オリンピックの開催年です!\n", year);
        } else {
            // 入れ子(ネスト)
            if(year % 4 == 2) {
                printf("%d年はうるう年ではありませんが、冬季オリンピックの開催年です!\n", year);
            } else {
                printf("%d年はうるう年ではありませんし、オリンピックも開催年されません!\n", year);
            }
        }
        
        // うるう年でなく、オリンピック開催年でもない場合
        year = 2017; 
        
        if(year % 4 == 0) {
            printf("%d年はうるう年で、夏季オリンピックの開催年です!\n", year);
        } else {
            // 入れ子(ネスト)
            if(year % 4 == 2) {
                printf("%d年はうるう年ではありませんが、冬季オリンピックの開催年です!\n", year);
            } else {
                printf("%d年はうるう年ではありませんし、オリンピックも開催されません!\n", year);
            }
        }
        
        // うるう年でなく、冬季オリンピックの開催年の場合
        year = 2018; 
        
        if(year % 4 == 0) {
            printf("%d年はうるう年で、夏季オリンピックの開催年です!\n", year);
        } else {
            // 入れ子(ネスト)
            if(year % 4 == 2) {
                printf("%d年はうるう年ではありませんが、冬季オリンピックの開催年です!\n", year);
            } else {
                printf("%d年はうるう年ではありませんし、オリンピックも開催されません!\n", year);
            }
        }
        
        return 0;
    }

    実行結果:

    2016年はうるう年で、夏季オリンピックの開催年です!
    2017年はうるう年ではありませんし、オリンピックも開催されません!
    2018年はうるう年ではありませんが、冬季オリンピックの開催年です!

    このサンプルコードでは西暦年数でオリンピックの開催年かどうかの判断をしています。夏季オリンピック開催年でない場合でも冬季オリンピックの開催年かどうかの判断をif文の入れ子で追加しています。

    ”また”や”かつ”(OR・AND)で複数条件を処理

    if文の条件式が2つ以上ある場合についてみていきましょう。条件式が2つ以上ある場合、「OR」「AND」といった論理演算子を使います。論理演算子には次のようなモノがあります。

    論理演算子の種類書き方例説明
    ORA || BAもしくはBのどちらか一方が「true」であれば、「true」の値を返す。
    A、Bどちらとも「false」の場合のみ、「false」の値を返す。
    ANDA && BA、Bどちらとも「true」の場合のみ、「true」の値を返す。
    AもしくはBのどちらか一方が「false」であれば、「false」の値を返す。
    NOT!AAが「true」の場合「false」の値を返す。
    「false」の場合「true」の値を返す。

    それではサンプルコードで確認していきましょう。

    #include <stdio.h>
     
    int main(void) {
        int year;
        
        // うるう年の場合
        year = 2016; 
        
        if(year % 4 == 0 || year % 4 == 2) {
            // ORの例
            printf("%d年はうるう年で、夏季もしくは冬季オリンピックの開催年です!\n", year);
        } else if(!(year % 4 == 0) && !(year % 4 == 2)) {
            // NOTとANDの例
            printf("%d年はオリンピックの開催年ではありません!\n", year);
        } else {
            // 処理は何もしない場合もエラーにはならない
        }
        
        // うるう年でなく、オリンピック開催年でもない場合
        year = 2017; 
        
        if(year % 4 == 0 || year % 4 == 2) {
            // ORの例
            printf("%d年はうるう年で、夏季もしくは冬季オリンピックの開催年です!\n", year);
        } else if(!(year % 4 == 0) && !(year % 4 == 2)) {
            // NOTとANDの例
            printf("%d年はオリンピックの開催年ではありません!\n", year);
        } else {
            // 処理は何もしない場合もエラーにはならない
        }
        
        return 0;
    }

    実行結果:

    2016年はうるう年で、夏季もしくは冬季オリンピックの開催年です!
    2017年はオリンピックの開催年ではありません!

    このサンプルコードでは、西暦年数が4で割り切れるか、もしくは余りが2の場合にオリンピックの開催年かどうか判断しています。「||」記号を使って2つの条件のどちらか一方を満たすか「OR」の判定を行っています。

    次にオリンピックの開催年ではない場合の判断をするために、「!」記号を使って西暦年数が4で割り切れないかつ余りが2でないという「NOT」の判定を行っています。

    さらに「&&」記号を使って2つの条件をともに満たすか「AND」の判定を行っています。なお、「else」句のブロックでは処理は何も記述していません。これでも問題が発生することはありません。

    等号・不等号(比較演算子)の使い方

    if文の条件式で必要になってくるのが比較演算子です。比較演算子は2つの値を比較します。比較とは、どちらの値が大きいか小さいか、等しいか等しくないかなど二者を比べることです。比較演算子は以下のとおりになります。

    書き方例説明
    不等号val1 < val2va1はval2より小さい
    val1 <= val2vai1はval2以下
    val1 > val2val1はval2より大きい
    val1 >= val2val1はval2以上
    等号val1 == val2val1はval2と等しい
    val1 != val2val1はval2と等しくない

    比較が正しければ「true」の値を返し、間違っていれば「false」を返します。サンプルコードで確認していきましょう。

    オリンピックではスケートやサッカーのように競技連盟のルールにより、出場に年齢制限があります。それを例としています。なお、等号のサンプルについては、前述のオリンピック開催年かどうかの判定を参考にしてくださいね。

    #include <stdio.h>
     
    int main(void) {
        int age;
        
        // スケートの年齢制限は15歳以上
        int limitLow = 15;
        // サッカーの年齢制限は23歳以下
        int limitHigh = 23;
        
        // 14歳の場合
        age = 14;
        
        if(age >= limitLow) {
            printf("%d歳ではスケートは出場できます\n", age);
        } else {
            printf("%d歳ではスケートは出場できません\n", age);
        }
        
        // 15歳の場合
        age = 15;
        
        if(age >= limitLow) {
            printf("%d歳ではスケートは出場できます\n", age);
        } else {
            printf("%d歳ではスケートは出場できません\n", age);
        }
        
        
        // 23歳の場合
        age = 23;
        
        if(age <= limitHigh) {
            printf("%d歳ではサッカーは出場できます\n", age);
        } else {
            printf("%d歳ではサッカーは出場できません\n", age);
        }
        
        // 24歳の場合
        age = 24;
        
        if(age <= limitHigh) {
            printf("%d歳ではサッカーは出場できます\n", age);
        } else {
            printf("%d歳ではサッカーは出場できません\n", age);
        }
        
        return 0;
    }

    実行結果:

    14歳ではスケートは出場できません
    15歳ではスケートは出場できます
    23歳ではサッカーは出場できます
    24歳ではサッカーは出場できません

    このサンプルコードでは、年齢制限以上の場合と年齢制限以下の場合で比較しています。なお、「等号」のサンプルコードについては前述のオリンピック開催年かどうかの判定を参考にしてくださいね。

    if文とbreak文やcontinue文でループを制御

    if文中の「break」句や「continue」句を使ってfor文のループを制御することがあります。詳しい内容についてはこちらを参考にしてくださいね。

    まとめ

    ここでは

  • if文・if else文の使い方
  • 論理演算子の使い方
  • 比較演算子の使い方

  • について説明しました。

    条件分けが必要な複雑な処理をするためには、if文を頻繁に使うことになるでしょう。そんなときに条件や判定が複雑になりどのように記述してよいか、わからなくなる場合もあるかもしれません。

    そんな場合はこの記事を何度も参考にして下さいね!

    この記事を書いた人

    【プロフィール】
    DX認定取得事業者に選定されている株式会社SAMURAIのマーケティング・コミュニケーション部が運営。「質の高いIT教育を、すべての人に」をミッションに、IT・プログラミングを学び始めた初学者の方に向け記事を執筆。
    累計指導者数4万5,000名以上のプログラミングスクール「侍エンジニア」、累計登録者数1万8,000人以上のオンライン学習サービス「侍テラコヤ」で扱う教材開発のノウハウ、2013年の創業から運営で得た知見に基づき、記事の執筆だけでなく編集・監修も担当しています。
    【専門分野】
    IT/Web開発/AI・ロボット開発/インフラ開発/ゲーム開発/AI/Webデザイン

    目次