今回は《条件分岐について学ぼう》というテーマで記事をまとめます。
「条件分岐」はプログラミングにおいて最も重要と言っても過言ではないので、今回もしっかり学んでおきましょう。
尚、現在執筆中のC言語入門記事は以下の人を対象としています。
- プログラミング未経験の人
- C言語プログラミングの学習をこれから始めたい人
- C言語プログラミングの学習を始めたばかりの人
条件分岐を学ぼう

条件分岐とは?
これまではmain関数に書いた順番で上から下へ処理が実行されていました。
条件分岐とは、≪条件が満たされたかどうかで次に行う処理を決定する≫処理です。

条件分岐を行うにあたって、C言語には以下の2種類の制御文が用意されています。
- if文
- switch文
if文
まずは基本となる「if文」の解説をしていきます。
if文は、「条件式」及び「条件式が真の場合(条件を満たしている場合)に実行する処理」を書くことができます。
書式は以下のようになっています。
if (条件式) 条件式が真の場合に実行する処理;
条件式は、≪関係演算子≫と呼ばれるものを用いて記述します。
| 演算子 | 読み方 | 例 | 意味 |
| == | イコール | a == b | a と b は等しい |
| != | ノットイコール | a != b | a と b は異なる |
| < | 小なり | a < b | a は b より小さい |
| <= | 小なりイコール | a <= b | a は b 以下 |
| > | 大なり | a > b | a は b より大きい |
| >= | 大なりイコール | a >= b | a は 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) | !a | aが偽の場合に真 |
書式は次のようになります。
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の値を変更して≪偽の場合のケース≫も確認しておいてくださいね。
次回はループ制御
今回は「プログラミングの根幹」こと「条件分岐」を学んでもらいました。
次回は「ループ制御」について解説します。
「ループ制御」まで習得できれば、プログラミングの世界がグッと広がります。
ご期待ください。
