• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:forループの中での初期化)

forループでの変数初期化の挙動について疑問

このQ&Aのポイント
  • forループの中で変数を初期化すると、その変数はループの範囲内でのみ有効です。
  • プログラムの実行中には、forループ外で変数が参照されることはありません。
  • iの初期化はforループの中で行われているため、forループ外ではiは無効です。なぜコンパイルエラーにならないのか疑問です。

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

  • ベストアンサー
  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.1

 int i;  for(i=0;i<5;i++){   System.out.print(x+i);  } と  int i;  i=0;  for(;i<5;i++){   System.out.print(x+i);  } と  int i=0;  for(;i<5;i++){   System.out.print(x+i);  } と  int i=0;  while(i<5){   System.out.print(x+i);   i++;  } が同じだからです。 つまり、参照の前に「確実に」代入が行われるなら、初期化はforの中でも外でもOK、と言う事なのです。

azicyan
質問者

お礼

回答ありがとうございます まだまだ理解が足りないようです。 宣言はネストの中(言い方変ですかね・・・) ではだめだが、 初期化は、その以前に確実に行われたのであれば (メソッド定義や、if文でfalseの場合はだめ) 初期化される、ということですね。 ありがとうございました!

その他の回答 (1)

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.2

>宣言はネストの中(言い方変ですかね・・・) >ではだめだが、 これは、変数スコープの問題です。 { と } で囲まれたブロックの中で宣言された変数は、宣言された場所からブロックの終りの } の位置まで有効なのです。 class Foo{  int x=10;  (略) } の場合も、Foo関数は「{ と } で囲まれた1つのブロック」ですので、宣言した位置から } の間であれば、何処ででも参照出来ます。 これは「ある1つのブロックから脱出する際には、ブロック内で定義された変数は、メモリから開放されて実体が消える」と言う処理が行われる為です。  for(int i=0;i<5;i++){   System.out.print(x+i);  }  System.out.print("\n"+i); 上記の例でコンパイルエラーになるのは  System.out.print("\n"+i); の時点でfor文のブロックから抜けていて変数iの実体が消えてしまい、存在しない変数を参照している為にコンパイルエラーになります。 逆に  for(int i=0;i<5;i++){   System.out.print(x+i);  }  for(int i=0;i<10;i++){   System.out.print(i+5);  } この場合は、2回iを定義していますが、1回目のfor文から抜けて変数iが消え去った後で定義し直しているので、エラーになりません。  int x=5;  for(int i=0;i<5;i++){   for(int i=0;i<5;i++){    System.out.print(x+i);   }   x++;  } 上記の例を試してみると、理解出来るかも知れません。

azicyan
質問者

お礼

わかりやすい例まで示していただいて ありがとうございます。 宣言は内側でされては無効だが、 内側で更新されたものに関しては、 反映する、と言うことですね。 (内側と言う言い方は正しくないかも・・・) わかったような気がします。 大変助かりました!

関連するQ&A