• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:JSについて教えてください。)

なぜFizzBuzzの条件文を一番上にもっていかなければならないのか?

このQ&Aのポイント
  • FizzBuzzの条件文を一番上にもっていかないと、意図した動作が行われない可能性があります。
  • continue;はその位置での処理を終了し、次の繰り返しに進むため、その上の条件文が実行されなくなってしまいます。
  • したがって、FizzBuzzの条件文は一番上にもっていく必要があります。

質問者が選んだベストアンサー

  • ベストアンサー
  • bya00417
  • ベストアンサー率33% (59/175)
回答No.1

continue はループ内の処理を中断し次のループへ進める命令です。 例示されているプログラムだと while(i < 100) { ・・・・ } の「・・・・」の部分が一回のループ処理です。 最初に「if(i % 3 === 0)」が評価され該当すると「console.log('Fizz');」を実行して continue になるので、それ以降のループ内の処理は実行されず次のループとしてループ処理の先頭に戻ってしまいます。 「if(i % 5 === 0 && i % 3 === 0)」が「if(i % 3 === 0)」より後にあると、「if(i % 3 === 0)」の処理が先に実行されるため「if(i % 5 === 0 && i % 3 === 0)」に辿り着く前に処理が中断されるので、永遠に「console.log('FizzBuzz');」が実行される事はありません。 「if(i % 5 === 0 && i % 3 === 0)」を最初に判定すると2つの条件が友に成立した時だけif文内の処理が実行され、両方が成立しない時だけ次の判定に進み、一つずつ条件が成立する場合の処理が行われます。 プログラムは原則として上から順に実行されるので、条件判定の順番は優先されるもの、複数条件が指定されるものから順に書いていかないと、目的の処理に到達する前に他の条件に合致して処理されてしまいます。

noname#226032
質問者

お礼

>>> 最初に「if(i % 3 === 0)」が評価され該当すると「console.log('Fizz');」を実行して continue になるので、 それ以降のループ内の処理は実行されず次のループとしてループ処理の先頭に戻ってしまいます。 真だった時のみcontinueが実行されるので真だった場合のみ100回繰り返さずに、 console.log('Fizz');だけ実行して他は一切実行せずに終了するということですね。 そして偽だったら何も行わずに次の5%のifに移りくりかえることにより、 真だった物だけ実行され偽だったものは実行されない状態を再現したのですね。 i++;はcontinueがないので必ず100回くりかえるということですね。 >>> 「if(i % 5 === 0 && i % 3 === 0)」を最初に判定すると2つの条件が友に成立した時だけif文内の処理が実行され、両方が成立しない時だけ次の判定に進み、一つずつ条件が成立する場合の処理が行われます。 プログラムは原則として上から順に実行されるので、条件判定の順番は優先されるもの、複数条件が指定されるものから順に書いていかないと、目的の処理に到達する前に他の条件に合致して処理されてしまいます。 if(i % 3 === 0){ console.log('Fizz'); continue; } if(i % 5 === 0){ console.log('Buzz'); continue; } if(i % 5 === 0 && i % 3 === 0){ console.log('FizzBuzz'); continue; } 上記の順番だと始めの二つのどちらかないしは両方が成立してしまうと、その時点で処理が終わってしまうので、 最後の処理がされることは100%ない矛盾した順番になってしまうのですね。 最後の複数条件は必ずifの先頭にないといけないかtうi++より上になってはいけないということですね。 確かにこちらは両方が真の時に実行するので片方ないしは両方が真であれば最後まで処理される前に終了しますね。

すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.3

>continue; はこれ以下の処理は実行しないようにするという意味のようですが、 >if内の記載以下の処理を実行しないようにするということなのでしょうか? 「for文、do…while文、while文」などのループの先頭に戻ると言う意味です。 >if(i % 5 === 0 && i % 3 === 0){ >console.log('FizzBuzz'); >continue; >} >の部分を一番上にもっていかないとこちらがうまくいかない理由がわかりますか? 「i % 5 === 0 && i % 3 === 0」が真になる場合を考えてみて下さい、「5でも割り切れ、かつ 3でも割り切れる」場合の例を1つ挙げると「i=15」ですので、「i=15」で説明すれば分かりやすいでしょう。 >if(i % 5 === 0 && i % 3 === 0){ >console.log('FizzBuzz'); >continue; >} ↑これが一番下で「i=15」場合 >if(i % 3 === 0){ >console.log('Fizz'); >continue; >} で真になって >console.log('Fizz'); >continue; ↑そのif文のブロックが実行され、「continue」でループの先頭に戻ってしまうので、それ以降の文は無視されてしまいます。 >if(i % 5 === 0 && i % 3 === 0){ >console.log('FizzBuzz'); >continue; >} ↑これが一番上で「i=15」場合 >console.log('FizzBuzz'); >continue; ↑そのif文のブロックが実行され、「continue」でループの先頭に戻ってしまうので、それ以降の文は無視されます。

すると、全ての回答が全文表示されます。
  • b0a0a
  • ベストアンサー率49% (156/313)
回答No.2

continueはforやwhileループ内で使い、今回のループの以後の処理を打ち切って、次回のループへ入るためのキーワードです こういったことは基本中の基本です MDNのこのページを隅から隅まで読めば分かるようになります https://developer.mozilla.org/ja/docs/Web/JavaScript

すると、全ての回答が全文表示されます。

関連するQ&A