質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

5回答

4970閲覧

javaの出力と文法の質問です

ai5

総合スコア40

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/11/03 03:17

参考書に出ていた下記の出力で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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

swordone

2016/11/07 06:51

実はi=0の段階でi%3==0が成立するので、永遠に0から変化出来ないという罠
cateye

2016/11/07 07:30

ごめ・・・みおとしですmm
guest

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

uniuni

総合スコア57

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

for(;;)はwhile(true)と同じです。

自分も知った当時はかなり違和感がありました。forの場合は条件を省略しても文法上OK(無条件ループになる)、whileの場合は条件を省略すると文法エラーとなる。つまり文法上for(;;)は可だがwhile()は不可、というのは不自然に思っておりました。ちなみにタイプ数だと前者の方が少ないので自分は前者を主に使っています。

この他、本プログラムにおいてはループを抜けることができません。breakとかretunとか例外とかでもループ強制脱出できますが、いずれもありません。しかも副作用(画面表示とかNWアクセスとかファイル書き込みとか)もないので全く無意味な計算が繰り返され続けることになります。

投稿2016/11/03 04:20

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ai5

2016/11/03 12:11

今回の構文をエラーが出ないように画面表示とかNWアクセスとかファイル書き込みで具体的に書いたらどう書きますか?
HogeAnimalLover

2016/11/03 12:34

for(;;){ System.out.println("test"); } これでひたすらtestと表示し続けることができます。
ai5

2016/11/06 04:05

具体的にご説明ありがとうございます。 わかりやすいです。 今回のようにi = 0で3で割り切れたらbreakという構文を作ったらどうなりますか? また、その時、System.out.printlnで表示される数字は何になりますか?
guest

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
swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ai5

2016/11/03 12:04

デッドコード初めて聞きました。ありがとうございます。 今回の構文は3で割り切れる数字は表示して、そのほかは3で割り切れない数字を表示という 構文でしょうか?いまいちよくわかってません。
swordone

2016/11/04 01:42 編集

現在のコードは、iが3の倍数ならiを0にし、それ以外ならiを1増やすというだけのコードで、出力がループの外にありますが無限ループにより出力は一切できません。 しかも現状、iが0から始まっているために、iが変化できません。
ai5

2016/11/06 04:07

無限ループにより出力は一切できないというのはなぜですか? たとえば、for(i = 0;i >3; i++)という条件をつければ、iが変化出来ると思いますが、 今回私が最初にあげた構文でエラーがでずにiが変化できる具体的な構文はありますか?
swordone

2016/11/06 04:32

人の話聞く気無いなら質問しないでください。
退会済みユーザー

退会済みユーザー

2016/11/06 04:57

>無限ループにより出力は一切できないというのはなぜ for(;;){ //break;を含まない処理 } System.out.println("表示"); このような順で書かれたコードでは  上から順にソースが実行されていくので for(;;){ } が実行されるとfor(;;){} は無限に回転し続け、永遠に次以降の行にある処理である System.out.println("表示"); に至ることがない ということです for(;;){}が前にある状態でこの状態を打開するには for(;;){}内から抜け出すための唯一の方法である break; を for(;;){}内のどこかの部分に入れ、 無条件でbreakが実行されるか for(;;){}が無限に回転し続けてるといつか break;が実行される条件を満たしbreak;が実行されるようにしなければなりません そうすれば 無条件か、条件を満たした時に System.out.println("表示"); が実行される事になります。 厳密にはfor(;;){}内でメソッド等を呼んでその中でSystem.exit();を使うなど 他の方法で抜け出す方法もあるかも知れませんが、その場合は System.out.println("表示"); 部分に処理は移らず終了します。
guest

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
archiver

総合スコア1557

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ai5

2016/11/03 12:02

printlnでどういう契機でiの値を表示させたいのでしょうか?についてですが、 3で割り切れる数字が出たらbreakするという場合だったら、どういう構文になりますでしょうか? ちょっとよくわかってなくて具体例などあまり思い浮かびません。
archiver

2016/11/03 14:11

回答欄に追記しました。breakでループを抜けるというのが分かっているなら、そんなに悩むところでもないかなと。 後、回答にも追記しましたが、こうした場合、i = 0に意味があるのかなぁというところが気になったところです。
ai5

2016/11/06 04:03

i = 0に意味がないのであれば、どうすれば意味ある数字になりますか?
archiver

2016/11/06 04:22

逆に質問しますが、ここで i = 0とするのは何故でしょうか? ループの外にあるprintlnで i の値を表示しますが、ここでの i の値は何を期待されていますか? 「i が3の倍数だったら」と条件付けてるのに、0にした後の値を表示するのって、何か不自然だと思いませんか。 質問の本題から外れることですが、このプログラムが何をしようとしているものかが明確でないことからこういう疑問というか気になった点が出てきただけです(「i が3の倍数になったら0にする」という動きをするものなら、それはそれでいいです)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問