制御構文
プログラムを作る上で変数の次に基本的な事項は、条件文と繰り返し処理です。
この2つの制御文を組み合わせることでほとんどのプログラムは記述することができます。
条件判断
条件判断は、「もし、○○だったならば、××を実行する」という処理の分岐を行います。
以下のソースコードは、変数x,yに関して、加算・減算・乗算・除算の四則演算を実行し、その結果を出力するものです。
#include <stdio.h> int main(int argc, char *argv[]) { int x = 16; int y = 4; printf("%d + %d = %d\n", x, y, x + y); printf("%d - %d = %d\n", x, y, x - y); printf("%d * %d = %d\n", x, y, x * y); printf("%d / %d = %d\n", x, y, x / y); return 0; }
xとyには任意の整数を入力できますが、このソースコードにはバグが潜んでいます。
加算・減算・乗算は問題がないのですが、yが0の時、除算すなわち割り算は行うことができません。
具体的にどうなってしまうのか確認する為に、
int y = 0;
としてコンパイルし、実行してみましょう。
コンパイルはエラーにならないのですが、実行するとエラーが発生してしまうと思われます。
これは0で割り算をしようとした為に発生した問題(バグ)です。
バグを取り除く為には、yが0の時は割り算をしないよう修正する必要があります。
条件判断文を使用することでこの問題は解決するでしょう。
条件判断文(if文)次のように記述します。
if(条件) { 条件がtrueの場合に実行される命令 } else { 条件がfalseの場合に実行される命令 }
if文を用いてyが0かどうかの判断を考慮したソースコードを示します。
#include <stdio.h> int main(int argc, char *argv[]) { int x = 16; int y = 0; printf("%d + %d = %d\n", x, y, x + y); printf("%d - %d = %d\n", x, y, x - y); printf("%d * %d = %d\n", x, y, x * y); if(y == 0) { printf("%d / %d は計算できません。\n", x, y); } else { printf("%d / %d = %d\n", x, y, x / y); } return 0; }
ifの中に見慣れない演算子「==」が出現しました。
これは左辺と右辺が等しいかどうかを判断する為の記号で、「比較演算子」と呼びます。
比較演算子には、「==(等しいかどうか?)」「!=(等しくないかどうか?)」「<(左のほうが小さい)」「<=(左のほうが小さいか、もしくは等しい)」などがあります。
また、条件文は条件を逆にした形で書き直すことができます。
すなわち、
if(y == 0) { printf("%d / %d は計算できません。\n", x, y); } else { printf("%d / %d = %d\n", x, y, x / y); }
は、
if(y != 0) { printf("%d / %d = %d\n", x, y, x / y); } else { printf("%d / %d は計算できません。\n", x, y); }
と書いても同じです。
また、if文は何重にも入れ子(ネスト)することができるので、「yが0でなく、かつxが1以上の場合」というような複雑な条件も記述することができます。
(メモ:論理式とド・モルガンの法則くらいはやる方がいいのか?)
繰り返し処理
繰り返し処理は条件判断(if文)と並んでプログラムに重要です。
例えば、1〜10までの数字を全て掛けた値を求めるには、
int y = 1 * 2 * 3 * ...... * 9 * 10;
と書くことができます。
しかし、変数の時と同じように、
int x = 10; int y = 1 * 2 * 3 * ...... * (x - 1) * x;
と書きたいところですね。
このような繰り返し処理を行う場合、for文やwhile文といった構文を利用します。
#include <stdio.h> int main(int argc, char *argv[]) { int x = 10; int y = 1; int i; for(i = 2; i <= x; i++) { y = y * i; } printf("1〜%dまで掛けた値は%dとなる。", x, y); return 0; }
for文は次のような構文で記述します。
for(初期化式; 条件判断式; 最初期化式)
{
繰り返し処理
}
for文では最初(1回目のみ)で初期化式が実行されます(例の場合はiに2を代入)。
次に条件判断式を判定し、trueであったならば繰り返し処理が実行されます。
falseの場合は処理が行われずにfor文の次の命令が実行されます。
(例の場合は、i=2, x=10なので 2 <= 10はtrueであり、1 * 2の結果がyに代入される)
繰り返し処理が行われたならば、最初期化処理が実行されます。
i++という記述は、i = i + 1と同じで、iが1増加(インクリメント)されます。
ここで再び条件判断式で判断され、繰り返し処理が行われるか、繰り返しが終了します。