C言語を学び始めただと、「プログラムって上から順番に実行されるだけじゃないの?」と思っていませんか?
実は、プログラムの流れを自由自在に操る「制御文」こそが、C言語で複雑な処理を実現するために必要なんです。
この記事では、C言語における制御文の「種類」に焦点を当て、条件によって処理を変える「分岐」や、同じ処理を繰り返す「繰り返し」など、基本的な制御文の役割と書き方、そして具体的な使い方をサンプルコード付きで徹底解説します。
この記事を読めば、あなたはC言語の制御文の種類とそれぞれの特徴を理解し、より実践的で思い通りのプログラムを作成できるようになります。
C言語の制御文とは?プログラムの流れを操る基本
C言語プログラミングを始めたばかりだと、書いたコードが上から順番に実行される、そんな風に感じていませんか? もちろん、基本はその通りなのですが、それだけだと決まった動きしかできませんよね。
例えば、もし〇〇だったらAの処理、そうでなければBの処理をしたい、とか、△△を10回繰り返したい、なんて思うこともあるでしょう。そんな時に登場するのが「制御文」です。
制御文は、プログラムの実行される順番をコントロールするための命令のこと。
これがあるから、プログラムは単純な上から下への流れだけでなく、状況に応じて処理を変えたり(これを条件分岐といいます)、同じ処理を繰り返したり(これを繰り返しといいます)できるのです。
C言語で意味のあるプログラムを作るためには、まさに基本となる知識といえるでしょう。
C言語の制御文の種類(条件分岐から繰り返しまで)
C言語の制御文には、いくつか種類があります。大きく分けると、次のようになります。
- 条件分岐 条件によって実行する処理を変えるもの(if文、switch文など)
- 繰り返し 同じ処理を何度も実行するもの(for文、while文、do-while文など)
- その他 ループの流れを変えるもの(break文、continue文など)
この記事では、これらの制御文がそれぞれどんな役割を持っていて、どうやって使うのかを順番に見ていきますよ。一つずつ、ゆっくり理解していきましょう!
条件分岐①:if文・if-else文の使い方
まずは、一番基本的な条件分岐、if文から見てみましょう。ifは英語で「もし~なら」という意味ですね。その名の通り、「もし条件が成り立ったら、この処理を実行する」という命令です。
if文の書き方
if (条件式) { // 条件式が真(成り立つ)の場合に実行する処理 }
次に、if文にelse(「そうでなければ」)を付け加えたif-else文です。「もし条件が成り立ったらAの処理、そうでなければBの処理を実行する」という、二択の分岐ができます。
if-else文の書き方
if (条件式) { // 条件式が真(成り立つ)の場合に実行する処理 } else { // 条件式が偽(成り立たない)の場合に実行する処理 }
使い方(サンプルプログラム)
例えば、点数によって「合格」か「不合格」か表示を変えてみましょう。
#include <stdio.h> int main(void) { int score = 75; // 点数 if (score >= 60) { printf("合格です!\n"); // scoreが60以上ならこちら } else { printf("残念、不合格です...\n"); // scoreが60未満ならこちら } return 0; }
実行結果
合格です!
コードの解説
int score = 75;
で、scoreという名前の箱(変数)に75という数値を入れています。if (score >= 60)
で、「もしscoreが60以上なら」という条件をチェックします。今回は75なので、条件は成り立ちます(真)。- 条件が成り立ったので、if文の中の
printf("合格です!\n");
が実行されます。 - elseの中の処理は実行されずに終わります。
もしscore
が50だったら、score >= 60
は成り立たない(偽)ので、elseの中のprintf("残念、不合格です...\n");
が実行されることになりますね。
条件分岐②:switch文の使い方
if-else文をたくさん繋げれば、いくつもの条件で処理を分けることもできます。でも、ある一つの値によって処理をたくさん分岐させたい場合、もっとスッキリ書けるswitch文というものがあります。
switch文の書き方
switch (式) { case 値1: // 式の値が値1と一致した場合の処理 break; case 値2: // 式の値が値2と一致した場合の処理 break; // ... 必要なだけ case を追加 ... default: // どのcaseの値とも一致しなかった場合の処理 break; }
使い方(サンプルプログラム)
例えば、1なら「大吉」、2なら「中吉」、それ以外なら「小吉」と表示するおみくじプログラムを作ってみましょう。
#include <stdio.h> int main(void) { int omikuji = 2; // おみくじの結果(1, 2, それ以外) switch (omikuji) { case 1: printf("大吉!\n"); break; // switch文を抜ける case 2: printf("中吉!\n"); break; // switch文を抜ける default: printf("小吉!\n"); break; // switch文を抜ける (default の break は必須ではないが良い習慣) } return 0; }
実行結果
中吉!
コードの解説
switch (omikuji)
で、変数omikuji
の値によって処理を分岐させます。今回は2ですね。case 1:
はomikuji
が1の場合ですが、今回は違うのでスキップ。case 2:
はomikuji
が2の場合。一致したので、中のprintf("中吉!\n");
が実行されます。- 次の
break;
は非常に肝心な命令です。これがswitch文から抜け出す合図。もしこれが無いと、その下のdefault:
の処理まで続けて実行されてしまうので注意が必要です(これをフォールスルーといいます)。 default:
は、どのcaseにも一致しなかった場合に実行される処理です。
繰り返し①:for文の使い方
プログラムでは、同じような処理を何度も繰り返したい場面がたくさんあります。例えば、「『こんにちは』と10回表示したい」とか、「1から100までの数字を足したい」とか。そんな時に便利なのが繰り返し(ループ)処理です。まずはfor文から見ていきましょう。
for文は、主に「決まった回数だけ処理を繰り返したい」ときによく使われます。
for文の書き方
for (初期化式; 条件式; 変化式) { // 条件式が真(成り立つ)の間、繰り返し実行される処理 }
- 初期化式 ループが始まる前に一度だけ実行される式(カウンタ変数の初期化など)
- 条件式 ループを続けるかどうかを判断する式
- 変化式 ループの処理が一回終わるごとに実行される式(カウンタ変数の更新など)
使い方(サンプルプログラム)
では、「こんにちは!」を3回表示してみましょう。
#include <stdio.h> int main(void) { int i; // カウンタ用の変数 // iを0から始めて、iが3未満の間、iを1ずつ増やしながら繰り返す for (i = 0; i < 3; i++) { printf("こんにちは! (%d回目)\n", i + 1); } printf("ループが終わりました。\n"); return 0; }
実行結果
こんにちは! (1回目) こんにちは! (2回目) こんにちは! (3回目) ループが終わりました。
コードの解説
for (i = 0; i < 3; i++)
の部分を見てみましょう。- まず初期化式
i = 0
が実行され、変数i
が0になります。 - 次に条件式
i < 3
がチェックされます。0は3未満なので、条件は成り立ちます(真)。 - ループの中の
printf
が実行され、「こんにちは! (1回目)」が表示されます。 - ループの中の処理が終わると、変化式
i++
が実行され、i
が1になります。 - 再び条件式
i < 3
がチェックされます。1は3未満なので真。 - ループの中の
printf
が実行され、「こんにちは! (2回目)」が表示されます。 - 変化式
i++
が実行され、i
が2になります。 - 再び条件式
i < 3
がチェックされます。2は3未満なので真。 - ループの中の
printf
が実行され、「こんにちは! (3回目)」が表示されます。 - 変化式
i++
が実行され、i
が3になります。 - 再び条件式
i < 3
がチェックされます。今度は3は3未満ではないので、条件は成り立ちません(偽)。 - 条件が成り立たなかったので、ループを抜けて、その次の
printf("ループが終わりました。\n");
が実行されます。
このように、for文はカウンタ変数(ここでは i
)を使いながら、決まった回数だけ処理を繰り返すのに適しています。
繰り返し②:while文の使い方
次に見るのはwhile文です。whileは英語で「~の間」という意味。for文が決まった回数の繰り返しに向いているのに対し、while文は「ある条件が成り立っている間、ずっと処理を繰り返したい」という場合に使われます。繰り返す回数が事前に分からない場合にも便利です。
while文の書き方
while (条件式) { // 条件式が真(成り立つ)の間、繰り返し実行される処理 }
while文は、ループに入る前にまず条件式をチェックします。条件が成り立てば中の処理を実行し、処理が終わったら再び条件式をチェック…という流れを繰り返します。
使い方(サンプルプログラム)
変数 `count` が5未満の間、その値を表示し続けるプログラムを作ってみましょう。
#include <stdio.h> int main(void) { int count = 0; // カウンタ変数 printf("whileループ開始!\n"); // countが5未満の間、繰り返す while (count < 5) { printf("count = %d\n", count); count++; // countを1増やす (これを忘れると無限ループ!) } printf("whileループ終了!\n"); return 0; }
実行結果
whileループ開始! count = 0 count = 1 count = 2 count = 3 count = 4 whileループ終了!
コードの解説
int count = 0;
でカウンタ変数を0で初期化します。while (count < 5)
で条件をチェック。0は5未満なので真。- ループ内の
printf
が実行され、「count = 0」が表示されます。 count++;
でcount
が1になります。(ここでcount
を変化させないと、count < 5
が永遠に真のまま無限ループになってしまいます!)- 再び条件
count < 5
をチェック。1は5未満なので真。 - ループ内の処理(表示と
count++
)が実行され、count
は2になります。 - ... これを繰り返し ...
count
が4のとき、printf
で「count = 4」が表示され、count++
でcount
は5になります。- 再び条件
count < 5
をチェック。5は5未満ではないので偽。 - 条件が成り立たなかったので、whileループを抜けて、次の
printf("whileループ終了!\n");
が実行されます。
このように、while文は条件が成り立っている限りループを続けます。
繰り返し③:do-while文の使い方
while文と似た繰り返し処理に、do-while文があります。while文はループに入る前に条件をチェックしましたが、do-while文は少し違います。「まずループの中の処理を1回実行してから、条件をチェックする」のです。そのため、条件が最初から成り立っていなくても、最低1回は処理が実行されるのが特徴です。
do-while文の書き方
do { // 繰り返し実行される処理(最低1回は実行される) } while (条件式); // ← セミコロンを忘れずに!
注意点として、最後の while (条件式)
の後にセミコロン ;
が必要です。忘れやすいので気をつけましょう。
使い方(サンプルプログラム)
while文と同じように、変数 `count` が5未満の間、その値を表示するプログラムをdo-while文で書いてみます。初期値を6にして、最低1回は実行されることを確認しましょう。
#include <stdio.h> int main(void) { int count = 6; // 初期値を6にする printf("do-whileループ開始!\n"); do { printf("count = %d\n", count); count++; // countを1増やす } while (count < 5); // 条件判定は最後! printf("do-whileループ終了!\n"); return 0; }
実行結果
do-whileループ開始! count = 6 do-whileループ終了!
コードの解説
int count = 6;
でカウンタ変数を6で初期化します。do { ... }
の中に入り、まずprintf("count = %d\n", count);
が実行され、「count = 6」が表示されます。- 次に
count++;
でcount
が7になります。 - ここで初めて条件
while (count < 5);
がチェックされます。7は5未満ではないので偽。 - 条件が成り立たなかったので、ループを抜けて、次の
printf("do-whileループ終了!\n");
が実行されます。
このように、最初の条件 count < 5
は成り立っていませんでしたが(6は5未満ではない)、do-while文なのでループの中の処理が1回だけ実行されました。これがwhile文との大きな違いです。
ループ処理の流れを変える制御文(breakとcontinue)
ループ処理(for文、while文、do-while文)を使っていると、途中でループを抜け出したくなったり、その回の処理だけをスキップして次に進みたくなったりすることがあります。そんな時に使うのが、break文とcontinue文です。
break文の使い方
break文は、ループやswitch文の処理をその場で中断し、ループやswitch文から完全に抜け出すための命令です。switch文では各caseの最後に書くのが一般的でしたね。ループ処理でも同じように使えます。
break文の書き方
break;
これだけです。シンプルですね!
使い方(サンプルプログラム)
1から10まで順番に数を表示するループで、もし数が5になったらループを中断してみましょう。
#include <stdio.h> int main(void) { int i; for (i = 1; i <= 10; i++) { printf("i = %d\n", i); if (i == 5) { printf("ここでループを抜けます!\n"); break; // ループ中断! } } printf("ループの後の処理\n"); return 0; }
実行結果
i = 1 i = 2 i = 3 i = 4 i = 5 ここでループを抜けます! ループの後の処理
コードの解説
- forループで
i
が1から順に増えていきます。 i
が1から4の間は、printf
で値が表示され、if (i == 5)
の条件は成り立たないので、何も起こりません。i
が5になったとき、まずprintf("i = 5\n");
が実行されます。- 次に
if (i == 5)
の条件が成り立ち、中のprintf
とbreak;
が実行されます。 break;
が実行された瞬間にforループは強制終了し、ループの外にあるprintf("ループの後の処理\n");
が実行されます。本来なら10まで続くはずでしたが、5で中断されました。
このように、break文はある条件が満たされたときにループを途中で抜けたい場合に役立ちます。
continue文の使い方
continue文は、break文と少し似ていますが、役割が違います。continue文は、ループの中で実行されると、その回のループの残りの処理をすべてスキップし、すぐに次の回のループ処理(for文なら変化式、while/do-whileなら条件判定)に移るための命令です。ループ自体は中断しません。
continue文の書き方
continue;
こちらもシンプルですね。
使い方(サンプルプログラム)
1から5までの数字を表示するループで、もし数字が3だったら表示をスキップしてみましょう。
#include <stdio.h> int main(void) { int i; for (i = 1; i <= 5; i++) { if (i == 3) { printf("iが3なので、今回はスキップします。\n"); continue; // この回の残りの処理をスキップして、次のループへ } // continueが実行されると、以下の処理は実行されない printf("i = %d を表示しました。\n", i); } printf("ループが終わりました。\n"); return 0; }
実行結果
i = 1 を表示しました。 i = 2 を表示しました。 iが3なので、今回はスキップします。 i = 4 を表示しました。 i = 5 を表示しました。 ループが終わりました。
コードの解説
- forループで
i
が1から順に増えていきます。 i
が1と2のときは、if (i == 3)
の条件は成り立たないので、continue;
は実行されず、下のprintf
で「i = 1 を表示しました。」「i = 2 を表示しました。」が表示されます。i
が3になったとき、if (i == 3)
の条件が成り立ちます。中のprintf
が実行された後、continue;
が実行されます。continue;
が実行されると、ループ内のそれ以降の処理(この場合、下のprintf("i = %d を表示しました。\n", i);
)は実行されずにスキップされ、すぐに次のループの処理(i++
と条件判定)に移ります。i
が4と5のときは、再びif
の条件は成り立たないので、下のprintf
が実行されます。
このように、continue文はループの中で特定の条件のときだけ処理を飛ばしたい場合に有効です。
C言語 制御文を使う上での注意点
制御文はとても便利ですが、いくつか気をつけたいポイントがあります。初心者のうちは特に間違えやすいので、頭の片隅に置いておきましょう。
インデント(字下げ)をしっかりする
if
や for
の中の処理は、Tabキーやスペースで少し右にずらして書く(インデントする)のが一般的です。C言語のルールとして必須ではありませんが、どこからどこまでが制御文の範囲なのかが格段に分かりやすくなります。読みにくいコードはバグの元です!
// 良い例 if (x > 0) { printf("正の値です。\n"); // インデントされている } // 悪い例 (読みにくい) if (x > 0) { printf("正の値です。\n"); // インデントされていない }
処理が1行でも {}
を省略しない
if文やfor文などで、中の処理が1行だけの場合、{}
(波括弧、ブロック)を省略して書くことも文法的には可能です。しかし、後から処理を追加したときに {}
を付け忘れると、意図しない動作の原因になります。常に {}
を書く癖をつけるのがおすすめです。
// 省略可能だが、非推奨 if (x > 0) printf("正の値です。\n"); // もし後で処理を追加すると... // 推奨される書き方 if (x > 0) { printf("正の値です。\n"); }
=
と ==
を間違えない
これは本当によくある間違いです! =
は代入(変数に値を入れる)、==
は比較(左右が等しいか調べる)です。if文などの条件式で比較したいのに =
を使ってしまうと、意図しない動作になります(多くの場合、エラーにはならず、条件が常に真と判定されてしまうなど、発見しにくいバグになります)。(例)
int a = 5; // 間違い (aに10を代入してしまう) if (a = 10) { ... } // 正しい (aが10と等しいか比較する) if (a == 10) { ... }
無限ループに注意
for文やwhile文で、ループを抜けるための条件がいつまでも満たされないと、プログラムが永遠にループし続けて止まらなくなってしまいます(無限ループ)。// 無限ループの例 (while) int count = 0; while (count < 5) { // countがずっと0のままなので、常に真 printf("ループ中...\n"); // count++; を書き忘れている! } // 無限ループの例 (for) // for (i = 0; ; i++) { // 条件式がない場合も無限ループ // for (i = 0; i >= 0; i++) { // iが減らない限り条件が偽にならない
switch文の break;
忘れ
switch文の各caseの最後に break;
を書き忘れると、処理が下のcaseに抜けて続けて実行されてしまいます(フォールスルー)。意図的にフォールスルーを使う場合もありますが、そうでなければ必ず break;
を書きましょう。これらの点に気をつけるだけで、バグが減り、読みやすいコードが書けるようになりますよ。
【まとめ】C言語の制御文をマスターしてプログラムの幅を広げよう
今回は、C言語のプログラムの流れをコントロールするための「制御文」について、その種類と基本的な使い方を見てきました。
- 条件分岐
if
(もし~なら)if-else
(もし~ならA、でなければB)switch
(式の値によって多分岐)
- 繰り返し
for
(主に回数指定の繰り返し)while
(条件が真の間ずっと繰り返し)do-while
(最低1回実行してから条件判定で繰り返し)
- その他
break
(ループやswitchを中断して抜ける)continue
(ループの今回の処理をスキップして次へ)
これらの制御文を理解し、使いこなせるようになると、作れるプログラムの幅がぐっと広がります。単に上から下に実行されるだけでなく、状況に応じて判断したり、面倒な繰り返しをコンピュータに任せたりできるようになるのです。
最初は少し難しく感じるかもしれませんが、この記事のサンプルコードなどを参考に、ぜひ自分でコードを書いて動かしてみてください。実際に手を動かすのが、一番の近道ですからね!頑張ってください!
【関連記事】
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。