皆さんこんにちは。
Numataです。
continueは処理が上に戻ると思っている皆さんは必見です。
continueしたはずなのに処理は進んでいるという謎現象を解決いたします!
それではよろしくお願いいたします!
もくじ
continueは一番内側の繰り返しの一番下の波カッコに移動します
はい、これが結論です。
この1文で理解できたあなたはもう満足でしょう。
しかし、今まで処理が上に戻ると思い込んでいた方は、
何を言っているんだこいつは。。
というような気持ちになっていると思います。
そもそもコンティニューって言っているんだから
やり直しだろう! と。
気持ちはわかります。
私も当初全く同じ解釈をしていました。
ですが間違った解釈をしていると、今後必ず躓く箇所が出てきます。
正しい解釈をしてcontinue文をマスターしましょう!
continueは処理を戻しません。飛ばします。
以下例文を用いて解説します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public class Sample01 { public static void main(String[] args) { //0~9 を10回出力しなさい。ただし、偶数の時は出力しないでください(for文を用いること) for (int i = 0; i < 10; i++) { //0~9の乱数numを作成 Random rand = new Random(); int num = rand.nextInt(10); //もし偶数だったらやり直し if (num % 2 == 0) { continue; } //出力する System.out.println(num); } } } |
この解答例は、出力の前に、2の倍数であればcontinueするという組み立てです。
この分の実行例はこのようになります。
1 2 3 4 |
3 1 3 7 |
”偶数の時は出力処理だけ飛ばされている”
状況だということが確認できると思います。
これはcontinue文の動きに原因があります。
numが偶数の場合、if文に入り、continueが実行されます。
その時、処理の移る先は、for文の終わりの ”}” ← ココです。
上に戻らず、下にジャンプするイメージです。
continue文は、処理は行いませんが1周としてカウントされます
下にジャンプすることが確認できました。
ではジャンプするとどのような処理になるでしょうか?
for文の最初の( ; ; )の中に存在する3つ目の式は”後処理”で行う式です。
for文内の処理が終わった後、必ず実行されます。
ジャンプした先は”}” ココでしたね。
ここはfor文の中の処理の一番最後の場所です。
となると、、
後処理である、i++ が実行されます!
結果、10回中、奇数のみが出力される というプログラムになってしまっています。
以下のように解決しましょう!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
for (int i = 0; i < 10; i++) { //0~9の乱数numを作成 Random rand = new Random(); int num = rand.nextInt(10); //もし偶数だったらやり直し if (num % 2 == 0) { //i++ が実行される前に、i--しておく。 i--; continue; } //出力する System.out.println(num); } |
1 2 3 4 5 6 7 8 9 10 |
3 7 7 9 9 9 7 9 9 9 |
continueする前に、i–しておくことで、continue後のi++を無効化でき、
無事10回出力されるようになりました!
continue文の動きはご理解いただけたでしょうか?
continueの名前の意味と、処理の動きが少し違うため、
最初は困惑しますが、慣れれば問題なく扱えるはずです!
continueは一番内側の繰り返しの一番下の波カッコに移動します
いかがだったでしょうか。
ちなみにこのcontinueはfor文が2重になっている場合、
”continue文が記述してあるfor文の1番内側” に対して有効です。(breakも同様)
2重目のfor文の中に合ったら、2重目のfor文の”}”に処理がジャンプします。
最初とは全く違うイメージの動き方をすることが理解できたと思います。
これであなたもcontinueの使い手です。
continueをうまく使って、繰り返しをマスターしましょう!
コメント