対象 | C言語初心者 |
記事概要 | C言語の分岐・反復について記載しています。 |
筆者 | Zuu [ ] C言語歴20年以上。 大手電機メーカーでの製品開発およびマネジメント経験がある現役エンジニアです。 プロジェクトマネージャ、システムアーキテクトなどの資格を保有しています。 |
はじめに
分岐・反復は、変数と同様にほぼすべてのプログラミング言語で使用すると言っても過言ではない基本機能です。プログラムは、分岐処理・反復処理および順次処理を組み合わせて記述していくことが多いです。
プログラミングの基本となる3つの処理「順次・分岐・反復」についての理解が不十分だと感じている場合は、以下の記事を参考にしていただければ幸いです。
分岐(if文)とは? 反復(ループ)とは?
if文(イフぶん)はプログラミング言語において、真理値に従って「もしXならば、Yせよ、さもなくばZせよ」というような条件実行の「文 (プログラミング) 」で、制御構造のひとつである。
ループとは、特定の条件下において特定の処理を繰り返すこと、あるいはそのように作られた制御構造のことを言う。
分岐も反復も、「真理値を用いた制御構造」という点のは共通です。
- 分岐:真理値によって、処理を切り替える。
- 反復:真理値によって、処理を繰り返す。
※真理値:真(true)、偽(false)
C言語での分岐・反復の扱い方
分岐・反復をC言語でどのように記述するのか見ていきましょう。
if文
まずは、特定の条件を満たした場合のみ処理を行う場合のif文です。
ifの後の括弧の中に条件を記載します。
1 2 3 |
if (a > 0) { printf("Positive\n"); } |
続いて、特定の条件を満たした場合と満たさなかった場合で処理を切り替える場合のif文(if else文)です。条件を満たさない場合にelse側の処理が実行されます。
1 2 3 4 5 6 |
if (a > 0) { printf("Positive\n"); } else { printf("Not Positive\n"); } |
2分岐より多い分岐にすることもできます。その場合、else if文を使います。
1つ目の条件がif文、2つ目以降がelse if文、その他がelse文となります。
1 2 3 4 5 6 7 8 9 |
if (a > 0) { printf("Positive\n"); } else if (a < 0) { printf("Negative\n"); } else { printf("Zero\n"); } |
if文の条件は、複数記述することもできます。
この時、複数の条件を両方満たしているか、片方だけを満たしているかで記述方法が変わります。
- 両方満たしている場合:AND(&&)
- 片方だけ満たしている場合:OR(||)
1 2 |
if ((a > 0) && (b > 0)) { } |
1 2 |
if ((a > 0) || (b > 0)) { } |
switch文
if文の他に分岐処理を記述する方法として、switch文があります。
switch文は、ある変数の取りうる値が決まっている場合に有効です。
取りうる値をcase文に記述していく形となります。
どのcase文にも該当しない場合に、default文が実行されます。
if文との使い分けができるようになりましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
switch (month) { case 1: printf("January\n"); break; case 2: printf("February\n"); break; ... case 12: printf("December\n"); break; default: printf("Illegal Month\n"); break; } |
また、以下のように記述することで、複数のcase文に対して同じ処理をすることもできます。
※break文が来たら終了と覚えましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
switch (month) { case 3: case 4: case 5: printf("Spring\n"); break; case 6: case 7: case 8: printf("Summer\n"); break; case 9: case 10: case 11: printf("Autumn\n"); break; case 12: case 1: case 2: printf("Winter\n"); break; default: printf("Illegal Month\n"); break; } |
while文
続いて、反復処理(ループ)の記述方法について理解しましょう。
while文は、括弧の中に反復条件だけを記述する反復処理です。
例えば、10回反復する処理は以下のようになります。
1 2 3 4 5 |
int a = 0; while (a < 10) { printf("loop\n"); a++; } |
do-while文
do-while文は、1回以上処理を行うような場合に使用する反復処理です。
※while文は、条件を満たさないと1回も処理を行わないことがあります。
1 2 3 4 5 |
int a = 0; do { printf("loop\n"); a++; } while (a < 10); |
for文
for文は、while文より凝ったことができる反復処理です。
初期化式、条件式、更新式を1文に記述する形となります。
for (初期化式; 条件式; 更新式)
1 2 3 4 |
int a; for (a = 0; a < 10; a++) { printf("loop\n"); } |
単純にN回反復させるだけなら、while文より簡潔に記述できるのが利点です。
その他に覚えておきたいこと
for文内の各式の様々な使い方
初期化式で変数宣言することもできます。
ローカル変数などと同名にならないように注意しましょう。
1 2 3 |
for (int a = 0; a < 10; a++) { printf("loop\n"); } |
初期化式、条件式、更新式は複数記述することができます。
初期化式と更新式はコンマで区切ります。
条件式はif文の括弧内と同様の記述方法となります。
1 2 3 |
for (int a = 0, b = 0; (a < 10) && (b < 10); a++, b+=2) { printf("loop\n"); } |
初期化式、条件式、更新式を省略することもできます。
この場合、無限ループとなります。
1 2 3 |
for (;;) { printf("loop\n"); } |
分岐処理・反復処理の組み合わせ方
while文は、反復条件を記述せずに使うこと(必ず真とする)があります。
この時break文とセットで使われることが多いので、覚えておきましょう。
1 2 3 4 5 6 7 8 |
int a = 0; while (1) { printf("loop\n"); a++; if (a == 10) { break; } } |
反復処理を入れ子にすることで、二重ループや三重ループを作成できます。
二次元の画像処理などによく使われますね。
1 2 3 4 5 |
for (int y = 0; y < 480; y++) { for (int x = 0; x < 640; x++) { printf("(x, y) = (%d, %d)\n", x, y); } } |
まとめ
- 分岐と反復とは、プログラミングの基礎で真理値を用いた制御構造。
- 分岐:特定の条件で処理を切り替える場合に使う。
- 反復:特定の条件で処理を繰り返したい場合に使う。
コメント