はじめに
なんだかんだ10年くらいプログラミングをやっているので、初心者の方からプログラミングについて質問を受けたり、なんだったらプログラミングの講義をすることも多いです。
そこで地味に勘違いしている方が多いのが「continue文」についてです。
いったい誰が「continue文」は「繰り返し処理の先頭に戻る」と言い出したのでしょうか…。
ネットで検索してみると 「繰り返し処理の先頭に戻る文」、「ループの最初に戻る文」等の誤った説明がたくさん。
実際には挙動が異なるため、苦し紛れに「for文の時は特別な処理~」「do~while文の時は条件のチェックをしてから~」等の追加説明までしている始末。
元から説明が間違ってたらそりゃ間違って覚えるよねという…。
continue文の正しい説明は?
ということで早速結論ですが、「continue文」の正しい説明は「最も内側の繰り返し処理の最後に移動する文」です。
次の図では、繰り返しの中で「continue文」が処理された場合に、「処理2」を飛ばして処理の最後(図中でいうと「}」)に移動していることを示しています。
continue文の挙動はたったこれだけです。簡単ですよね?
なんで変な説明があるのか邪推してみた
「continue文は」ただ「最も内側の繰り返し処理の最後に移動する文」で、説明も理解も簡単です。
これが「繰り返し処理の先頭に戻る」などといった説明に変化するのか疑問に思うくらいです。
しかし、「繰り返し処理の最後」という表現がわかりにくく、「繰り返し処理の最後ってどこ?」となる気持ちはわからなくもないのです。
例えば、次のコードの「繰り返し処理の最後」はどこですか?もっと言うと、このコードでは「continue文」はどのような挙動をしますか?
#include <stdio.h> int main() { int i; //繰り返し処理 for(i = 0; i < 10; i++) if(i == 0){ printf("%d\n", i); continue; }//強いて言うならここが繰り返し処理の最後? return 0; }
このコードだと「繰り返し処理の最後」を指し示すこと自体が難しくないですか?
「continue文」の挙動を示すなら「繰り返し処理の最初に移動して繰り返し順が1つ先に進む」のような説明をしたくなりませんか?
文法上、説明し難いパターンがあるから変な説明になった?
ところで、前述のコード。ややトリッキーに書いてあり文法上に問題があるように見えますが、別に文法上はなんの問題もない記述方法になっています。
for文、while文は次の形式で書きます。
for(繰り返し処理の最初に実施される式; 継続条件; 繰り返し処理の最後に実施される式) 文
while(継続条件) 文
どちらも継続条件が満たされている間、文が実行されます。「文」と言うのが重要なポイントで、「if文」も「{」と「}」で囲った複文も同じ「文」です。
このため、前述のコードは文法上問題ありません。
初心者に教える時に文のことを詳しく説明することは皆無
「文」のことを詳しく説明している初心者向けのサイト(参考書も)はほぼ皆無と言ってもいいです。その上、講師側でも知らない人がいることもあります。
このため、「文」の理解がないとわからない「繰り返し処理の最後」より、誰でも直感的にわかる「繰り返し処理の先頭」が好まれて説明されているのかなと思いました。
最後に
色々邪推してみたものの、正しい説明をするならば「continue文」は「最も内側の繰り返し処理の最後に移動する文」です。
ややこしい解釈をしている人や、勘違いしている人がいたら教えてあげてください!
コメント