何らかの条件を与えたとき、動作を変えたい場合がある. これが,条件分岐である.
例えば,入力した数値が奇数か偶数か判断するプログラムはどうなるだろう か. 以下のプログラムは条件分岐を利用して,入力した数値が奇数の時に”奇数 です”と答えるプログラムである.
#include <stdio.h> int main(void) { int n; printf("整数値を入力してください\n"); scanf("%d",&n); if( (n % 2) !=0){ printf("奇数です.\n"); } return 0; } |
赤字の部分が,今回学ぶ制御構造(if文)の部分である.
if文の基本的な形を図2.1に示す. 上の例(example21.c)では, (n % 2)!=0が条件, { printf("奇数です.\n"); }がブロックである.
図2.1に示すような if文では,,条件式が正しい時に次に続くブロックが 実行され,条件が正しくなければブロックが飛ばされる. |
![]() |
n % 2 は,nを2で割った余りを計算する.
したがって,n % 2 が 0でない(1の時)場合,nは奇数である.
if(条件式)は,条件式が成り立つか成り立たないか(すなわち,真であるか偽であるか)を判断する.真の時にその次の ブロックを実行する.
if((n % 2) != 0)"!=" は左辺と右辺が等しくないことを表す.したがって,(n % 2)が1なら
1!=0と,条件式が真であるため次のブロックが実行され,“奇数です”と表示される. もし,n が偶数なら (n % 2) は 0である.したがって,
0!=0となり,条件式が偽であるため次のブロックを抜かして次の行 return 0 へと進む.そして,終了する.
C言語では,ブロックの内部か外部かを表すために字下(タブ)を用いる.
字下げすることで,入れ子になったブロックをわかりやすく見せることがで
きる. 必ず,ブロック内は字下げすること. |
条件式には,
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文では,if文中の条件が真の時のみ制御ができた.if else 文を用いると, 真と偽の両方の制御を行うことができる.
example21.cに else { } を加え, 入力された値が,奇数か偶数か答えるプログラムの例を示す.
|
![]() |
その他の例題を示す. example23.c
もっと,沢山分岐したい時には,どうすれば良いだろうか?偽の中身をさら に分岐させる方法として,else if が用意されている.
#include <stdio.h> int main(void) { int n, m; printf("整数を二つ入力してください\n"); printf("整数N:"); scanf("%d", &n); printf("整数M:"); scanf("%d", &m); if (n == m){ printf("NとMは等しい\n"); }else if (n > m){ printf("NはMより大きい\n"); }else{ printf("MはNより大きい\n"); } return 0; } |
if ~ else if ~ else if ~ else の構造と処理の流れ
|
![]() |
は,次のプログラムでも同様な処理をする.
|
|
右の例は,example2_1.cと全く等しい制御を行う.
(左の例は,結果的に同じ動作をするが,制御自身は異なる.)
論理式は&&(andかつ),||(orまたは)で結合できる .
たとえば,変数kが 2 < k < 10の範囲のとき実行したい場合は,
if(k > 2){ if(k < 10){ /* 2 < k < 10の時に実行される文*/ } }で表すことができるが,論理式の結合によって
if( (k > 2) && (k < 10) ){ /* 2 < k < 10の時に実行される文*/ }とすることができる.
# include |
なお,この例はかなり冗長になっている.
if文を使っての条件式の間違いとして,"==" を "="と間違えることがよくあ ります. コンパイラによっては,間違いを指摘してくれるものがありますが,よく注 意しましょう.
./hello > outputのようにコマンド実行することで,printf()による画面への出力(標準出力)がoutputというファイルに保存される.