C言語:forループ vs. whileループ:使い分けのポイント
C言語における「forループが終了しない」問題の解説
ループ条件の誤り
forループは、以下の構文で記述されます。
for (初期化; 条件式; 更新式) {
ループ内で実行する処理
}
ループが終了するためには、条件式が最終的に false
になる必要があります。もし条件式が常に true
になる場合、ループは無限に繰り返されます。
例:
for (int i = 0; i < 10; i++) {
// 処理
}
このコードでは、i
は常に 0
以下なので、条件式 i < 10
は常に true
となり、ループは無限に繰り返されます。
解決策:
- 条件式が正しく記述されていることを確認してください。
- ループカウンタが適切な値で更新されていることを確認してください。
break文の誤使用
break文は、forループを途中から抜けるための構文です。しかし、break文の使い方が誤っていると、意図せずループが終了してしまうことがあります。
for (int i = 0; i < 10; i++) {
if (i == 5) {
break;
}
// 処理
}
このコードでは、i
が 5 になった時にbreak文が実行され、ループが終了します。しかし、i
が 5 になる前に条件式が false
になる場合、ループは途中で終了してしまいます。
- break文は、ループを終了したいタイミングでのみ使用してください。
- 条件式とbreak文の組み合わせを慎重に検討してください。
上記以外にも、以下のような原因でforループが終了しない場合があります。
- 無限ループが発生するバグ
- スタックオーバーフロー
#include <stdio.h>
int main() {
int i = 0;
for (i = 0; i < 10; i++) {
printf("%d\n", i);
}
return 0;
}
#include <stdio.h>
int main() {
int i = 0;
for (i = 0; i < 10; i++) {
printf("%d\n", i);
// i を 1 ずつ増加させる
i++;
}
return 0;
}
#include <stdio.h>
int main() {
int i = 0;
for (i = 0; i < 10; i++) {
if (i == 5) {
break;
}
printf("%d\n", i);
}
return 0;
}
#include <stdio.h>
int main() {
int i = 0;
while (i < 10) {
printf("%d\n", i);
// i を 1 ずつ増加させる
i++;
// i が 5 になったらループを抜ける
if (i == 5) {
break;
}
}
return 0;
}
#include <stdio.h>
int main() {
int i = 0;
for (i = 0; i < 10; i++) {
// 無限ループ
while (1) {
printf("%d\n", i);
}
}
return 0;
}
#include <stdio.h>
int main() {
int i = 0;
for (i = 0; i < 1000000; i++) {
// スタックオーバーフローが発生する可能性がある処理
...
}
return 0;
}
C言語におけるforループの終了方法
条件式を満たすようにする
forループは、条件式が false
になるまで繰り返されます。そのため、ループを終了するには、条件式が false
になるようにする必要があります。
for (int i = 0; i < 10; i++) {
// 処理
// 条件を満たしたらループを抜ける
if (条件) {
break;
}
}
break文は、forループを途中から抜けるための構文です。
for (int i = 0; i < 10; i++) {
// 処理
// 特定の条件になったらループを抜ける
if (条件) {
break;
}
}
continue文を使用する
continue文は、forループの次の反復処理へスキップするための構文です。
for (int i = 0; i < 10; i++) {
// 特定の条件を満たす場合は処理をスキップ
if (条件) {
continue;
}
// 処理
}
goto文を使用する
goto文は、プログラム内の任意の場所にジャンプするための構文です。
for (int i = 0; i < 10; i++) {
// 処理
// 特定の条件になったらループを抜ける
if (条件) {
goto 終了;
}
}
終了:
return文を使用する
return文は、関数から値を返して関数を終了するための構文です。
int main() {
for (int i = 0; i < 10; i++) {
// 処理
// 特定の条件になったらループと関数を終了
if (条件) {
return 0;
}
}
return 0;
}
whileループを使用する
forループは、whileループで置き換えることもできます。
int i = 0;
while (i < 10) {
// 処理
// ループカウンタを増加させる
i++;
}
do-whileループは、少なくとも1回は処理が実行されるループです。
int i = 0;
do {
// 処理
// ループカウンタを増加させる
i++;
} while (i < 10);
for-eachループを使用する
for-eachループは、配列などの要素を順番に処理するためのループです。
int array[] = {1, 2, 3, 4, 5};
for (int i : array) {
// 処理
}
c