参考書に出ていた下記の出力で3点質問があります。
1)for(;;)は見たことのない記述ですが、どんな用法というか、
どんな効果がある文法ですか?
2)この文に制御が移ることはありません と出力されますが、
どう修正すれば正しく出力されますか?
3)参考書の回答には次のような説明があります。
4行目から9行目のforループから抜けることがないため、
10行目に制御が移ることがない。
そのため、コンパイル時に10行目でコンパイルエラーとなる
しかし、なぜ、4行目から9行目のforループから抜けられないのでしょうか?
i % 3 == 0 だからですか?
java
1 2public class Q26 { 3public static void main(String[] args){ 4int i = 0; 5for(;;){ 6if (i % 3 == 0) 7i = 0; 8else 9i++; 10 } 11System.out.println(i); 12 } 13} 14 15
javaはまだまだ始めたばかりでわからないことばかりですので、
教えていただけたら幸いです。
よろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
永久ループの事については皆さんの意見を見ていただくとして、よく分からないのは、i=0;のところです。
iの変化を見ると0→1→2→3→0→1と変化をしますよね?・・・これは、何をしたいのでしょうか?
あと、3になったら0にするなら i%3==0ではなくi==3で事足りると思いますが?
ちなみに「100までの3の倍数を列挙する」プログラムをfor(;;)を使って書くなら以下のようになります。
java
1 int i= 0; 2 for(;;){ 3 if( i % 3 == 0){ 4 System.out.println(i); // 3の倍数を表示 5 } 6 i++; 7 // 100以上だったらループを抜ける 8 if( i > 100 ){ 9 break; 10 } 11 } 12
投稿2016/11/07 06:39
総合スコア6851
0
もしかしたらなのですが、
java
1int i = /* ここに数字を入力 */; 2while(i % 3 != 0){ 3 i++; 4} 5System.out.println(i); //iは3の倍数となる
というコードをfor(;;)で表現したいという話ではないでしょうか?
そうならば、
java
1int i = /* ここに数字を入力 */; 2for(;;){ 3 if(i % 3 == 0){ 4 break; 5 } 6 i++; 7} 8System.out.println(i);
とするのが正解だと思います。
iを3の倍数にする為に、iが3の倍数でない間、i++するのです。
「for(; i != 3;)」と「while(i != 3)」が同じなのは他の方が紹介しておられるので省略します。
投稿2016/11/06 05:25
総合スコア57
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
for(;;)はwhile(true)と同じです。
自分も知った当時はかなり違和感がありました。forの場合は条件を省略しても文法上OK(無条件ループになる)、whileの場合は条件を省略すると文法エラーとなる。つまり文法上for(;;)は可だがwhile()は不可、というのは不自然に思っておりました。ちなみにタイプ数だと前者の方が少ないので自分は前者を主に使っています。
この他、本プログラムにおいてはループを抜けることができません。breakとかretunとか例外とかでもループ強制脱出できますが、いずれもありません。しかも副作用(画面表示とかNWアクセスとかファイル書き込みとか)もないので全く無意味な計算が繰り返され続けることになります。
投稿2016/11/03 04:20
総合スコア4830
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/11/03 12:34
2016/11/06 04:05
0
for文のセミコロンで区切られた文は、順に初期化文、継続条件、更新文となっています。これはそのいずれも指定しない書き方です。
- 初期化文 → 最初にforに入る際に行う処理
- 継続条件 → 初期化文または更新文の実行後に判定するbooleanを返す式。trueなら続行。何もなければ無条件続行。
- 更新文 → for文の内容が1回終了するごとに実行する処理
特に継続条件がないものは、内部でbreakやreturnを実行しない限り、無限ループになります。
forループから抜け出す方法はいくつかあり、
0. 継続条件の判定がfalseになる
0. break文の実行
(for以外に、while,switchブロックから抜け出すのにも使う)
0. return文の実行
(メソッド内のどこからでも実行でき、そのメソッドを抜け出す)
0. 例外の発生
(ループの外にcatchがあればループを抜けそこに行く)
しかしこのforループはこのいずれも起こり得ません。そのため、永遠にforループの内容を実行することになり、forループの次にある文は絶対に実行されることのない「デッドコード」となり、ミスと見なされてコンパイルエラーになるのです。
投稿2016/11/03 03:26
編集2016/11/06 06:03総合スコア20651
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/11/03 12:04
2016/11/04 01:42 編集
2016/11/06 04:07
2016/11/06 04:32
退会済みユーザー
2016/11/06 04:57
0
for(;;)
という書き方は無限ループとなります(終了条件やループの後処理がないので)。while(true)
と同じですね。
なので、ループの外の処理に移るためには、このループを抜ける処理または条件を記述すれば良いです。
と言うか、println
でどういう契機でi
の値を表示させたいのでしょうか?それ次第で如何様にも書き直す方法は出てきます。
3で割り切れる数字が出たらbreakするという場合
単純な例ですが、
Java
1for(;;) { 2 if (i % 3 == 0) { 3 i = 0; 4 break; 5 } 6 else 7 i++; 8}
になりますかね。ただ、i = 0
が意味あるのかというのが気になるところですが…(printlnで表示確認する意図次第ですね)。
if文のthen節およびelse節で複数の処理を行わせる場合は{}
で括ります(この辺は学習済みかもしれませんが)。
投稿2016/11/03 03:24
編集2016/11/03 14:09総合スコア1557
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/11/03 12:02
2016/11/03 14:11
2016/11/06 04:03
2016/11/06 04:22
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/11/07 06:51
2016/11/07 07:30