なぜ無限ループになるコードを書いてしまうのかを考える
プログラミングでは、「繰り返し実行する」プログラムを書くことがちょくちょくあります。このとき、注意しないと「終わることなく繰り返し実行する」プログラム、いわゆる無限ループと呼ばれるもの、になってしまうことがあります。
とくにプログラミングを学び始めたばかりだと、無限ループを書いてしまうことは結構ある、という印象です。
そこで、私がプログラミングを教えた経験の範囲(延べ人数で100人ぐらい)で、どうしてなのかを考えてみました。
まず、ループ(繰り返し)について
単純な例として「1から100までの数字を表示する」で考えてみます。
もちろん、1を表示する、2を表示する、、、100を表示する、と100回書いてもプログラムは動作しますが、それでは大変ですね。なので、ループを使ってプログラムしてみます。(コード例はPHPですが、他の言語でも大筋は同じです。)
for ( $i = 1; $i <= 100; $i++ ) {
echo $i;
}
↑の例はforという構文を使っています。同じ処理をwhileという構文を使うと↓のようになります。
$i = 1;
while ( $i <= 100 ) {
echo $i;
$i++;
}
無限ループになるのはどんな時か?
無限ループになるのは、コードをループが終了するように書かなかったときです。上の「1から100までの数字を表示する」だと、
数字が100以下かどうか?
がループの終了の判定になります。コードだと $i <= 100 の部分です。ですが、実際にコードを書く上で注意する必要があるのは、
数字を1つずつ増やす
を忘れないことです。コードだと $i++ の部分です。ここを忘れてしまい、無限ループになる、というケースを多くみてきました。
whileで無限ループが起きやすい
私の経験した範囲では、whileで無限ループが起きやすいです。一方でforで無限ループになったことは、今まで見たことがありません。
無限ループになる例は、↓のコードのように、whileを使っていて、数字を1ずつ増やすコードが抜けるケースです。
$i = 1;
while ( $i <= 100 ) {
echo $i;
// ここの記述が抜ける
}
その理由は、おそらく↓です。
for の場合は、ループ関連の記述をまとめて書く。(水色の枠)
whileの場合は、ループ関連の記述があちこちに別れる。(橙色の枠)
↓
forを使う場合は、ループ関連の記述をまとめて書くため、うっかり一部分を書き漏らす可能性は低い。
whileを使う場合は、注意していないとループ関連の記述の一部分が抜け落ちやすく、ループ関連の記述が不完全になりやすい。
学習時の工夫
私が書いたプログラミング入門書では、以下のように注意書きを入れるようにしました。
とはいえ、本質的には構文自体を改善してミスしにくい構文を考えるほうが良いのかな、と考えています。
良いアイデアありましたら、コメントでお知らせください。