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

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

ただいまの
回答率

88.05%

for文の判定タイミングとその評価値

受付中

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 5,636

score 24

java初心者です。

ArrayListの要素だけfor文を回すプログラムを作成しています。

ArrayList<Integer> test = new ArrayList<Integer>();

test.add(1);
for(int i=0;i<test.size();i++){
//
この中でもし数字が正ならば
test.add(r);
でtestに要素が追加される
//
}

こんな感じのプログラムです。
つまりforループの中でtest.size()の値が増加する場合があるというものです。
要素が追加されたときにはもう一度ループしてほしいという意図です。

ここで質問なのですがforループの値の判定はいつの時点の値をもって判定されるのでしょうか。

いつ判定がなされるかについては
forループの一番上で
だと思っていますがその評価する値はいつの時点の値を以て行うのでしょうか。

自分の作成したプログラムが正しく動作していない原因がここにあるのか知りたいです。
宜しくお願いいたします。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+5

今後似たようなことがあった時のためにまわりくどい答え方をすると、
今回のような「どう判定されるんだろう」「どういう順番で処理されるんだろう」みたいなものは
それを確かめる小さなプログラム組んで実験すればネット上で人に聞くよりすぐわかります。

今回の場合はforループ中でループカウンタを都度出力して、
初期サイズで出力が止まるかそれ以上行くか確かめるとか、
デバッガで処理を追うとかすればいいのです。

適当にやるならこんな感じでしょうか
ArrayList<Integer> test = new ArrayList<Integer>();
test.add(1);
for(int i=0; i<test.size(); i++){
    System.out.printf("%d\n",i);
    test.add(1);
    if(i>10){ // 無限ループになられると面倒なので適当なところで打ち切る
        break;
    }
}
ループ開始時のみにtest.size()が評価されるなら0としか出力されませんし、
そうでないなら0 1 2 ...と続きます。

ちなみに実行すると続く方の結果になります。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+3

初心者さんとのことなので、質問の趣旨からはずれますがコメントいたします。

ループの終値が確定していない場合(特に今回のようにデータサイズが変わる可能性がある場合)
for文よりもwhile文を使用した方がよいと思います。

”途中でデータサイズが変わった時、どこまでループ処理してくれるのか” わからなくて質問されたのですよね。
ということは、このプログラムを他の人が見た時(あるいはずっと時間がたってからあなたがまた見た時)に、同じ疑問を持つ可能性があります。
while文ならばこういう疑問は持たなくて済むと思います。
「コメント書いておけばよい」と思われるかもしれませんが、コード自体を明確な記述方法で書くことが一番大切です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

for 文の評価のタイミングは for (ループに入る前に1度だけ評価; ループ各周の開始前に毎回評価し、真なら本体を実行; 本体の実行後に毎回評価) { 本体 } となります。

つまり、i<test.size() は毎回評価されるので、 for ループの中で test の要素数が増えればそのぶんループ回数も増えます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

for(A;B;C){
    D
}
とすると,流れとしては
  1.  Aの文による初期化
  2.  Bの判定→trueなら3.へ,falseならループ終了
  3.  Dの部分の実行 終わるかcontinue文の実行で4.へ
  4.  Cの実行→2.に戻る
という流れになります.
Bもbooleanを返す命令文なので,何らかのメソッドがあれば当然その都度実行され値が返されます.
(と言うか一定値で固定ならIteratorやScannerのhasNext()が役に立たない)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.05%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る