C言語/do
概要
[編集]do-while ループは C 言語の繰り返し構文の一つで、処理を最低1回実行した後に条件を評価し、その条件が真である限り処理を繰り返します。他のループ構文とは異なり、条件判定が処理の後に行われるため、最初の実行は無条件に行われます。
構文
[編集]do { /* 実行する文 */ } while (条件式);
do-while ループは以下の順序で実行されます:
- 波括弧
{}で囲まれた文(ループ本体)を実行する - 条件式を評価する
- 条件式が真(ゼロ以外)なら1に戻る、偽(ゼロ)なら次の文へ進む
基本的な使用例
[編集]#include <stdio.h> int main() { int count = 1; do { printf("%d ", count); count++; } while (count <= 5); printf("\nループ終了後: count = %d\n", count); return 0; }
実行結果:
1 2 3 4 5 ループ終了後: count = 6
このコードでは、count の値を表示してからインクリメントし、count が 5 以下である限りループを続けます。
while ループとの比較
[編集]do-while ループと while ループの主な違いは、条件判定のタイミングです。以下にその違いを示します:
| 特性 | do-while ループ
|
while ループ |
|---|---|---|
| 条件の評価タイミング | ループ本体の実行後 | ループ本体の実行前 |
| 最小実行回数 | 1回 | 0回 |
| 構文 | do { 処理 } while (条件);
|
while (条件) { 処理 }
|
同じ処理を行う do-while と while の比較
[編集]#include <stdio.h> int main() { int i = 1; printf("do-whileループ: "); do { printf("%d ", i); i++; } while (i <= 5); printf("\n"); i = 1; // カウンタをリセット printf("whileループ: "); while (i <= 5) { printf("%d ", i); i++; } return 0; }
実行結果:
do-whileループ: 1 2 3 4 5 whileループ: 1 2 3 4 5
この場合、両方のループは同じ結果を生成します。しかし、初期条件が既に偽である場合は結果が異なります:
#include <stdio.h> int main() { int i = 10; printf("do-whileループ: "); do { printf("%d ", i); i++; } while (i <= 5); printf("\n"); i = 10; // カウンタをリセット printf("whileループ: "); while (i <= 5) { printf("%d ", i); i++; } return 0; }
実行結果:
do-whileループ: 10 whileループ:
do-while ループでは条件に関わらず本体が1回実行されますが、while ループでは条件が最初から偽であれば本体は実行されません。
実用例
[編集]ユーザー入力の検証
[編集]do-while ループは、ユーザーからの入力を検証する場合に特に便利です:
#include <stdio.h> int main() { int number; do { printf("1から10までの数字を入力してください: "); scanf("%d", &number); if (number < 1 || number > 10) { printf("無効な数字です。再入力してください。\n"); } } while (number < 1 || number > 10); printf("入力された有効な数字: %d\n", number); return 0; }
このプログラムは、ユーザーが1から10までの有効な数字を入力するまで入力を促し続けます。
メニュー駆動システム
[編集]#include <stdio.h> int main() { int choice; do { printf("\nメニュー:\n"); printf("1. 新規ファイル\n"); printf("2. ファイルを開く\n"); printf("3. ファイルを保存\n"); printf("4. 終了\n"); printf("選択してください (1-4): "); scanf("%d", &choice); switch (choice) { case 1: printf("新規ファイルを作成しました。\n"); break; case 2: printf("ファイルを開きました。\n"); break; case 3: printf("ファイルを保存しました。\n"); break; case 4: printf("プログラムを終了します。\n"); break; default: printf("無効な選択です。再度選択してください。\n"); } } while (choice != 4); return 0; }
このプログラムは、ユーザーが「終了」オプションを選択するまでメニューを表示し続けます。
他のループと同様に、do-while ループも入れ子にして使用できます:
#include <stdio.h> int main() { int i = 1; do { int j = 1; do { printf("%d,%d\t", i, j); j++; } while (j <= i); printf("\n"); i++; } while (i <= 5); return 0; }
実行結果:
1,1 2,1 2,2 3,1 3,2 3,3 4,1 4,2 4,3 4,4 5,1 5,2 5,3 5,4 5,5
このプログラムは、三角形のパターンを出力します。
break と continue の使用
[編集]do-while ループ内でも break と continue ステートメントを使用してループの制御ができます:
#include <stdio.h> int main() { int i = 0; do { i++; if (i == 3) { printf("iが3の時はスキップします\n"); continue; // 現在の反復をスキップして次の反復へ } if (i == 7) { printf("iが7になったのでループを終了します\n"); break; // ループを完全に終了 } printf("i = %d\n", i); } while (i < 10); printf("最終的な i の値: %d\n", i); return 0; }
実行結果:
i = 1 i = 2 iが3の時はスキップします i = 4 i = 5 i = 6 iが7になったのでループを終了します 最終的な i の値: 7
do-while の注意点
[編集]セミコロンの忘れ
[編集]do-while ループは、while の後にセミコロンが必要です。これを忘れるとコンパイルエラーが発生します:
// 誤った使用法 do { 処理 } while (条件) // セミコロンがない - エラー // 正しい使用法 do { 処理 } while (条件); // セミコロンがある
無限ループ
[編集]do-while ループで無限ループを作成する場合は、条件式に 1 または true を使用します:
do { printf("無限ループ\n"); // ループを抜け出す条件 if (特定条件) { break; } } while (1);
まとめ
[編集]do-while ループは、処理を最低1回実行する必要がある状況で特に役立ちます。ユーザー入力の検証やメニュー駆動システムなど、処理が少なくとも1回は実行されるべきシナリオに最適です。条件判定が処理の後に行われるという特性を理解し、適切な場面で使用することで、効率的で読みやすいコードを書くことができます。