【独学C言語入門⑦】条件分岐について学ぼう【if/switch】

今回は《条件分岐について学ぼう》というテーマで記事をまとめます。

「条件分岐」はプログラミングにおいて最も重要と言っても過言ではないので、今回もしっかり学んでおきましょう。

尚、現在執筆中のC言語入門記事は以下の人を対象としています。

  • プログラミング未経験の人
  • C言語プログラミングの学習をこれから始めたい人
  • C言語プログラミングの学習を始めたばかりの人

条件分岐を学ぼう

条件分岐を学ぼう

条件分岐とは?

これまではmain関数に書いた順番で上から下へ処理が実行されていました。

条件分岐とは、≪条件が満たされたかどうかで次に行う処理を決定する≫処理です。

条件分岐を行うにあたって、C言語には以下の2種類の制御文が用意されています。

  • if文
  • switch文

if文

まずは基本となる「if文」の解説をしていきます。

if文は、「条件式」及び「条件式が真の場合(条件を満たしている場合)に実行する処理」を書くことができます。

書式は以下のようになっています。

if (条件式) 条件式が真の場合に実行する処理;


条件式は、≪関係演算子≫と呼ばれるものを用いて記述します。

演算子読み方意味
==イコールa == ba と b は等しい
!=ノットイコールa != ba と b は異なる
<小なりa < ba は b より小さい
<=小なりイコールa <= ba は b 以下
>大なりa > ba は b より大きい
>=大なりイコールa >= ba は b 以上

各演算子に対する簡単なサンプルと実行結果をまとめておきます。

今回、全ての条件式が真となるようなサンプルを用意しました。条件式や変数の値を変更してif文の使い勝手を試してみてください。

#include<stdio.h>

void main(){
    int num = 100;
    printf("num = %d\n",num);

    if (num == 100) printf("num は 100 です\n");

    if (num != 200) printf("num は 200 ではありません\n");

    if (num < 150) printf("num は 150 より小さいです\n");

    if (num <= 100) printf("num は 100 以下です\n");

    if (num > 50) printf("num は 50 より大きいです\n");

    if (num >= 100) printf("num は 100 以上です\n");
}

複数処理の実行

上記で紹介したif文は条件式1つに対して、1つの処理しか実行できませんでした。

しかし、次のような書式で記述すると、条件式1つに対して複数の処理を実行することができます。(サンプルは割愛します)

if (条件式) {
    条件式が真の場合に実行する処理①;
    条件式が真の場合に実行する処理②;
    条件式が真の場合に実行する処理③;
}

条件分岐

if文は「条件式が真の場合に実行する処理」とは別に「条件式が偽の場合(条件を満たしていない場合)に実行する処理」を書くことができます。

if (条件式) {
    条件式が真の場合に実行する処理;
} else {
    条件式が偽の場合に実行する処理;
}


また、if文は単純な条件分岐だけでなく、複数の条件分岐を実装することもできます。

if (条件式①) {
    条件式①が真の場合に実行する処理;

} else if(条件式②) {
    条件式①が偽かつ条件式②が真の場合に実行する処理;

} else if(条件式③) {
    条件式①と条件式②が偽かつ条件式③が真の場合に実行する処理;

} else {
    条件式①~③が偽の場合に実行する処理;

}


サンプルも用意したので実行してみてください。

#include<stdio.h>

void main(){
    int num = 100;
    printf("num = %d\n",num);

    if (num > 200) {
        printf("num は 200 より大きいです\n");
    } else if(num == 200) {
        printf("num は 200 です\n");
    } else {
        printf("num は 200 未満です\n");
    }
}

本サンプルだと、"num は 200 未満です"の1文しか表示されません。numの値を変更して、if文の各処理を表示してみてください。

条件式の強化(複数の条件式・条件式の否定)

条件式はもう少し複雑に記述することができます。

例えば、「num が 100 以上、かつ、num が 200 未満」のような複数の条件式を組み合わせることができるのです。

それには≪論理演算子≫を使用します。

演算子名称意味
&&論理積(AND)a && b式aが真、かつ、式bが真の場合に真
||論理和(OR)a || b式aが真、または、式bが真の場合に真
!否定(NOT)!aaが偽の場合に真

書式は次のようになります。

if (条件式① && 条件式②) {
    条件式①が真 かつ 条件式②が真の場合に実行する処理;
}

if (条件式③ || 条件式④) {
    条件式②が真 または 条件式④が真の場合に実行する処理;
}

if (!条件式⑤) {
    条件式⑤が偽の場合に実行する処理;
}


サンプルも用意したので実行してみてください。

#include<stdio.h>

void main(){
    int num = 100;
    printf("num = %d\n",num);

    if (num >= 100 && num < 200){
        printf("num は 100 以上 かつ 200 未満です\n");
    }

    if (num <= 100 || num >= 200){
        printf("num は 100 以下 または 200 以上です\n");
    }

    if ( !(num > 150) ){
        printf("「num は 150 より大きい」の否定=「num は 150 以下」です\n");
    }

}

switch文

switch文は、一言でいうと「値と定数値を用いた複数の条件分岐」です。

基本的な書式は次のようになります。

switch (式) {
case 定数①:
    値が定数①の場合に実行する処理;
    break;

case 定数②:
    値が定数②の場合に実行する処理;
    break;

case 定数③:
    値が定数③の場合に実行する処理;
    break;

default:
    値が定数①~定数③のどれでもない場合に実行する処理;

}

「式」には分岐に用いたい変数などを記述します。ここに指定できるのは、文字または整数値のみです(浮動小数点は指定できません)。

caseの後の「定数」には分岐の条件となる値を記述します。「値」とcaseの後の「定数」が一致した場合、そのcaseからbreakまでの処理が実行されます

それでは「breakを書かなかったらどうなるのか?」という疑問が産まれると思います。C言語のswitch文では、breakを書かなかった場合、一致したcase以降全ての処理が実行されます

また、全てのケースに該当しなかった場合、defaultの処理が実行されます。尚、defaultについては省略可です。

サンプルを用意しましたので実行してみてください。

#include<stdio.h>

void main(){
    int num = 1;
    printf("num = %d\n",num);

    switch (num) {
    case 1:
        printf("num は 1 です\n");
        break;

    case 2:
        printf("num は 2 です\n");

        /* ここに break がない為、num が 2 の場合、case 3 の処理も実行される */

    case 3:
        printf("num は 2 または 3 です\n");
        break;

    default:
        printf("num は 1,2,3 のどれでもありません\n");

    }

}


また、今回は num の値を 2、3、100 にした実行結果も載せておきます。

【補足】三項演算子(条件演算子)

条件分岐の制御文とは少し異なるのですが、C言語には「三項演算子(条件演算子)」と呼ばれる演算子が存在します。

三項演算子とは、簡単に説明すると「if-else文を1文で書いたもの」です。

基本的な書式は次のようになります。

条件式 ? 条件式が真の場合の値 : 条件式が偽の場合の値

書式だけ見てもなんのこっちゃ状態だと思うので、三項演算子のサンプルコードおよび、それをif文で書いた場合のコードを用意しました。(結果画面は両方とも同じになります)

#include<stdio.h>

void main(){
    int num = 1;
    int num2 = 0;
    printf("num = %d\n",num);

    num2 = ( num == 1 ) ? 10 : 100;

    printf("num2 = %d\n",num2);
}
#include<stdio.h>

void main(){
    int num = 1;
    int num2 = 0;
    printf("num = %d\n",num);

    if( num == 1 ){
        num2 = 10;
    } else {
        num2 = 100;
    }

    printf("num2 = %d\n",num2);
}

本サンプルは条件式が≪真の場合のケース≫ですが、numの値を変更して≪偽の場合のケース≫も確認しておいてくださいね。

次回はループ制御

今回は「プログラミングの根幹」こと「条件分岐」を学んでもらいました。

次回は「ループ制御」について解説します。

「ループ制御」まで習得できれば、プログラミングの世界がグッと広がります。

ご期待ください。

タイトルとURLをコピーしました