条件分岐とは
今までのプログラムでは上から下へと順番に命令を行なっていくものでした。しかし、プログラムは一方通行ばかりではありません。条件分岐についてイメージしてみましょう。あなたは今冒険をしています。ドラクエの勇者とかポケモントレーナーにでもなった様子を想像しましょう。目の前には分かれ道。分かれ道の前に看板があります。看板には「○○村← →○○洞窟」の記述が。

この看板は、「あなたが○○村に行きたいなら、左に行きなさい。あなたが○○洞窟に行きたいなら、右に行きなさい。」という「条件(赤字)と命令(青字)」を意味していますよね。プログラミングでも同様に、条件と命令を記述していく必要があります。
条件
{
命令
}
と記述することで条件分岐を行います。条件には、if文、(do)while文、for文、switch文があります。では、これら各文について学んでいきましょう。
if文
入力された数値が「正、0、負」のどれに該当するかを出力するプログラムを作りましょう。
#include<stdio.h>
int main(void)
{
int num;
printf("数値を入力してください:");
scanf("%d",&num);
if(num==0) //a==b:aとbが等しければ、a!=b:aとbが異なるならば
{
puts("入力された数字は0です.");
}else if(num>0){
puts("入力された値は正です");
}else{
puts("入力された値は負です");
}
return 0;
}
入力された値は正です
数値を入力してください:-10
入力された値は負です
数値を入力してください:0
入力された値は0です
解説
if(条件)
{
命令1
}
で「もし条件のとき命令1を実行」となります。
else
{
命令2
}
で「これまでの条件以外のとき命令2を実行」となります。
これらは組み合わせることもできまして、
else if(条件)
とすることで「これまでの条件以外のうち(条件)のとき」ということを意味します。
==演算子や!=演算子のことを等価演算子と言います。一般的には学校で習った数学の知識により「a=b」で「aとbが等しい」ってことじゃないの?と思われると思いますが、変数の時に説明したようにプログラミングの世界では「a=b」は「aという変数にbという値を代入する」という意味になります。そこで「aとbが等しい」を実現するために「a==b」、「aとbが異なる」を「a!=b」で表します。
ちょっとしたポイント
正、0、負に分けるようなプログラムのとき、「数値が正かどうか→0かどうか→負かどうか」の順で条件分岐を行いがちですが、最初に数値が一つに限定されるもの(このプログラムでいえば0)を使って条件分岐したほうがわかりやすいプログラムになります。プログラムを作るときわかりやすいかどうかを意識できるようになると脱初心者の第一歩になるでしょう。
(do)while文
基本的には、do文、while文というように分けて言います。しかし、do文はwhile文と一緒に使うという特性上一緒に説明していきます。ではまず、while文についてみていきましょう。
#include<stdio.h>
int main(void){
int plus,minus;
int i=0;
printf("正の数値を入力してください:");
scanf("%d", &plus);
minus = plus;
while(minus>0){
printf("%d ",minus--);
}
puts("");
while(i<plus){
printf("%d ",++i);
}
puts("");
return 0;
}
10 9 8 7 6 5 4 3 2 1
1 2 3 4 5 6 7 8 9 10
解説
while文は
while(条件)
{
命令
}
で表現し、「条件が満たされる間命令を繰り返す」という条件分岐となります。
”++”をインクリメント演算子、”–”をデクリメント演算子といい変数を+1または-1します。これらの演算子を変数の前につける時、、「前置インクリメント(デクリメント)演算子」と呼ばれ、変数の後ろにつける時、、「「後置インクリメント(デクリメント)演算子」と呼ばれます。
前置演算子とは、式を評価する前にインクリメント(デクリメント)、しますよということを意味します。プログラムでいえば
printf("%d ",++i);
が該当し、printfでiの値を出力する前にiの値を+1しています。
後置演算子は前置演算子とは順番が逆で、式を評価した後で変数をインクリメントまたはデクリメントします。
続いてdo文です。do文は少なくとも一度は命令を実行したい時に使用されます。生まれた月を訪ねるプログラムで見てみましょう。
#include<stdio.h>
int main(void){
int month;
do{
printf("あなたの誕生月は?:");
scanf("%d",&month);
}while(month<1||month>12);
puts("thank you!");
return 0;
}
あなたの誕生月は?:15
あなたの誕生月は?:3
thank you!
解説
do
{
命令
}while(条件);
で表します。
これまでと異なるのが、条件が命令の後に記述されるということです。
こうすることで少なくとも一度は命令が実行されることになります。その後while文の条件を評価して、命令を繰り返すかどうかが決まります。
for文
for文はwhile文のように繰り返し(ループ)を行うために用いられますが、while文よりもわかりやすく読みやすいためwhile文より多用されます。
べき乗を計算するプログラムを用いてfor文の使い方を確認してみましょう。
#include<stdio.h>
int main(void){
int r,n,x;
printf("数値を入力してください:");
scanf("%d",&r);
printf("何乗しますか?:");
scanf("%d",&n);
x=r;
for(int i=1;i<n;i++)
{
r = r*x;
}
printf("%dの%d乗は%dです\n",x,n,r);
return 0;
}
何乗しますか?:3
2の3乗は8です
解説
for文は
for(式1;式2;式3)
{
命令
}
で表現されます。式1は前処理と言われ、繰り返しの前に一度だけ評価されます。式2は制御式と言われ、ここが基本的な条件になります。式3は後始末と言われ、ループ後に評価されます。
i=1
while(i<n){
r=r*x;
i++;
}
と書き換えられますね。
練習問題
九九の表を作ってみましょう。
#include<stdio.h>
int main(void)
{
for(int i=1;i<=9;i++){
for(int j=1;j<=9;j++){
printf("%2d ",i*j);
}
puts("");
}
return 0;
}
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81
解説
まず、iが1の時が評価されます。その中の命令にfor文があるためjが1から9までの値の時i*jを出力します。その後iが2となり、この時jが1から9までというように繰り返されます。
switch文
switch文は多岐に条件分岐させたいときに用いられます。do文のところで作成した誕生月を尋ねるプログラムを改変してswitch文の使い方について確認してみましょう。
#include<stdio.h>
int main(void){
int month;
do{
printf("あなたの誕生月は?:");
scanf("%d",&month);
}while(month<1||month>12);
printf("あなたは");
switch(month){
case 1:
case 2:
case 3: printf("冬"); break;
case 4:
case 5:
case 6: printf("春"); break;
case 7:
case 8:
case 9: printf("夏"); break;
case 10:
case 11:
case 12: printf("秋"); break;
}
printf("生まれです.\n");
return 0;
}
あなたは冬生まれです.
あなたの誕生月は?:7
あなたは夏生まれです.
解説
switch(変数)
{
case 変数の値: 命令
}
で表します。
breakと記述することで、条件分岐から抜け出します。もしbreakがなければ、変数の値が合致するところ以降の命令が全て実行されてしまうため、このプログラムで例えば”4″と入力したとき”あなたは春夏秋生まれです.”と出力されてしまいます。

C言語学習におすすめのテキストはこちら