- ベストアンサー
forループでの変数初期化の挙動について疑問
- forループの中で変数を初期化すると、その変数はループの範囲内でのみ有効です。
- プログラムの実行中には、forループ外で変数が参照されることはありません。
- iの初期化はforループの中で行われているため、forループ外ではiは無効です。なぜコンパイルエラーにならないのか疑問です。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
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、と言う事なのです。
その他の回答 (1)
- chie65536
- ベストアンサー率41% (2512/6032)
>宣言はネストの中(言い方変ですかね・・・) >ではだめだが、 これは、変数スコープの問題です。 { と } で囲まれたブロックの中で宣言された変数は、宣言された場所からブロックの終りの } の位置まで有効なのです。 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++; } 上記の例を試してみると、理解出来るかも知れません。
お礼
わかりやすい例まで示していただいて ありがとうございます。 宣言は内側でされては無効だが、 内側で更新されたものに関しては、 反映する、と言うことですね。 (内側と言う言い方は正しくないかも・・・) わかったような気がします。 大変助かりました!
お礼
回答ありがとうございます まだまだ理解が足りないようです。 宣言はネストの中(言い方変ですかね・・・) ではだめだが、 初期化は、その以前に確実に行われたのであれば (メソッド定義や、if文でfalseの場合はだめ) 初期化される、ということですね。 ありがとうございました!