Phase #04

制御文


1.2種類の文

制御文の前に「文」とは何かを簡単に説明します。
前章でを説明しましたが、プログラムの基本的な単位と言え、「実行する動作を指定するもの」です。文は単文と複文とにわけられます。

単文


式の後ろに「 ; 」(セミコロン)を付けたもの単文といいます。

a = 3;

C言語では「 ; 」はとても重要でコンパイラがコンパイルする際に文の終わりを判断するのに使っています。文中にあるスペースや改行は意味を持たないので次の文はコンパイラにとっては同じプログラムとみなされます。
☆ Program1 ☆
 a=c* 3;
  d=
 c+b
  ;;
☆ Program2 ☆
 a = c * 3;
 d = c + b;
同じ理由で1行に単文をいくつか並べても構いません。

a = b; c = d;

複文


単文や変数の宣言部分などを「 { 」と「 } 」で囲んだもの複文、またはブロックといいます。「 } 」の後ろには「 ; 」は付けません。
{
  int a,b;

  a = 3;
  b = 17 * a;
}
複文はプログラム中の意味のある固まりを表す時に使われます。これから説明する制御文や後で出てくる関数などに使われます。

2.制御文の使い方

制御文とはプログラムの実行するときの流れを制御する、つまり状態に応じて実行する内容を変化させるための文のです。C言語の制御文は「構造化プログラミング」という考えに基づいて設計されています。
構造化プログラミングとは、「順接」「繰り返し」「分岐」の3つの組み合わせでプログラムの流れをつくるという考え方です。「順接」とは文を一定方向に向かって実行していくこと、「繰り返し」は同じところを繰り返し実行すること、「分岐」は条件によって実行する流れを変えること、です。
C言語は基本的に上から順番に実行され、これが順接にあたります。繰り返しと分岐は制御文によって実現されています。
それでは最初に基本的な制御文であるif文、if - else文、while文から見ていきましょう。

A.if文


if文は条件に応じて処理する文を変える命令で構造化プログラミングで言う「分岐」にあたります。
条件の判定には式の演算結果を使います。式の演算結果が(0以外)の時はif文のブロックが実行され、(0)の時には実行されません。
 if ( 式 ) {
  文
 }

下のプログラムは偶数の場合だけ偶数であることを表示するプログラムです。
[ 例 ] if文の使用例  ex4-01.cGet! ソースファイル
int val = 128; /* 変数の宣言・初期化 */

if (val % 2 == 0) { /* 2で割り切れる数=偶数 */
 printf ("%d は偶数です。\n", val);
}

文が単文である場合は「 { } 」を省略できますが、コーディングする際のミスの原因になりやすいので単文の場合でも「 { } 」を書くように心がけましょう。

[例] aが10以上のときにaを0にしたい
文が単文の場合は・・・

if (a >= 10)
 a = 0; // 文1
a++;

式が真の場合だけ文1が実行されるので問題はありません。
ここで0であることを表示する文2を付け加えることにした。このとき「 { } 」を付け忘れてしまうと・・・

if (a >= 10)
 a = 0; // 文1
 printf ("a = 0を実行しました。\n"); // 文2
a++;

aが9以下の時にも文2が実行されてしまい間違ったプログラムになってしまいます。

B.if - else文


基本的にはif文と同じですが、式の演算結果が偽の時に実行する部分も定義できます。
式の演算結果が真の場合は文1を、偽の場合は文2を実行します。
 if ( 式 ) {
  文1
 } else {
  文2
}

[ 例 ] if - else文の使用例  ex4-02.cGet! ソースファイル
int val = 127; /* 変数の宣言・初期化 */

if (val % 2 == 0) { /* 2で割り切れる数=偶数 */
 printf ("%d は偶数です。\n", val);
} else { /* 2で割りきれない数=奇数 */
 printf ("%d は奇数です。\n", val);
}

またif - else文を使ってif文を拡張すると複数の条件に応じた処理をさせることが出来ます。
if ( 式1 ) {
 文1
} else if ( 式2 ) {
 文2
 ・
 ・
 ・
} else if ( 式n ) {
 文n
} else {
 文n + 1
}

[ 例 ] if - else文とif文を組み合わせた例  ex4-03.cGet! ソースファイル
int val = 350; /* 変数の宣言・初期化 */

if (val > 500) { /* 500より大きい */
 printf ("%d は500より大きい数です。\n", val);
} else if (val > 300) { /* 300より大きく、500以下 */
 printf ("%d は300と500の間の数です。\n", val);
} else if (val > 100) { /* 100より大きく、300以下 */
 printf ("%d は100と300の間の数です。\n", val);
} else { /* 100以下 */
 printf ("%d は100以下の数です。\n", val);
}

C.while文


while文は「繰り返し」を処理する文で、「式」の結果が真の間は文を何度でも繰り返し実行します。
 while ( 式 ) {
  文
 }

[ 例 ] while文の使用例  ex4-04.cGet! ソースファイル
int val = 1; /* 変数の宣言・初期化 */

while (val < 8) { /* 値が8より小さい間は繰り返し処理する */
 if (val % 2 == 0) { /* 2で割りきれる数=偶数 */
  printf ("%d は偶数です。\n", val);
 } else { /* 2で割りきれない数=奇数 */
  printf ("%d は奇数です。\n", val);
 }
 val++; /* valの値を1増やす */
}

「式」の特別な例として1があります。この場合は常に結果が真となり無限ループ状態になります。
式や文の内容によっては同じように無限ループになります。こうなるとプログラムはいつまで経っても終わらなくなるので注意が必要です。(強制的に終了させる方法がちゃんとあります)
ただしあとで出てくるbreak文というものを使えばループから抜け出せるので意図的に使う場合もあります。

[ 例 ] 無限ループになる例  ex4-05.cGet! ソースファイル
int val = 1; /* 変数の宣言・初期化 */

while (val > 0) { /* 値が0より大きい間は繰り返し処理する=無限ループ */
 if (val % 2 == 0) { /* 2で割りきれる数=偶数 */
  printf ("%d は偶数です。\n", val);
 } else { /* 2で割りきれない数=奇数 */
  printf ("%d は奇数です。\n", val);
 }
 val++; /* valの値を1増やす */
}

このプログラムを実行すると・・・
無限ループになっている

終了してくれません。この時、Ctrl + C("Ctrl"キーと"C"を同時に押す)を入力すると強制的にプログラムを終了させられます。
無限ループを止めた

これら3つの制御文はプログラミングをするのになくてはならない存在なのでしっかり理解して下さい。
制御文は他にもいくつかありますが、3つの制御文が基本となっています。


Jump to Phase #03-2Phase #03-2: 式と演算子(2) へ
Phase #04-2: 制御文(2) へJump to Phase #04-2

△戻る
▲トップに戻る