今回は《条件分岐について学ぼう》というテーマで記事をまとめます。
「条件分岐」はプログラミングにおいて最も重要と言っても過言ではないので、今回もしっかり学んでおきましょう。
尚、現在執筆中の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の値を変更して≪偽の場合のケース≫も確認しておいてくださいね。
次回はループ制御
今回は「プログラミングの根幹」こと「条件分岐」を学んでもらいました。
次回は「ループ制御」について解説します。
「ループ制御」まで習得できれば、プログラミングの世界がグッと広がります。
ご期待ください。