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

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

forループの中での初期化

class Foo{   public static void main(String args[]){     int x=10;     for(int i=0;i<5;i++){       System.out.print(x+i);     }     System.out.print("\n"+i);   } } このプログラムはコンパイルエラーが出ます。 iがforループの中で宣言されていてその外では無効だからです。 そこで class Foo{   public static void main(String args[]){     int x=10;     int i;     for(i=0;i<5;i++){       System.out.print(x+i);     }     System.out.print("\n i="+i);   } } のようにしてみました。 i=5と出ました。 ふと、iは確かに宣言されているけど、初期化はforの中でしかされていないのになぜコンパイルエラーにならなかったんだろう??、と思ってしまいました。 おかしくないでしょうか?

  • Java
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • 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

  • forループの中での初期化

    http://www.okweb.ne.jp/kotaeru.php3?q=802781 すいません。またわからなくなってしまいました。 class Fooo{   public static void main(String args[]){     int a;     int b=10;     int c;     for(int i=0;i<5;i++){       a=10;       c=b+i;       System.out.print(c);     }     System.out.println(a);   } } 初期化は「確実に」行われていますよね? aが初期化されてない、というコンパイルエラーが出るのです・・・ なぜですか???

    • ベストアンサー
    • Java
  • java ネストしたfor文について

    ***** **** *** ** * 上のように*が減るようにしたいのですが下のソースではどこが悪いか教えてください class TestGoo{ public static void main(String args[]){ for(int i = 5; i>=1; i--){ for(int j = 5;j>=1; j--){ System.out.print('*'); } System.out.println(); } } }

  • #の表記

    ########## ######### ######## ####### ###### ##### #### ### ## # を表記するプログラムを組みたいんですが public class Test { public static void main(String[] args) { int i; String x = ""; for( i=10; i>0; i--){ x=x+"#"; System.out.print(x); System.out.println(); } } } これだと上下がさかさまになってしまうんです。どこを直したらよいのでしょうか。お願いします。

    • ベストアンサー
    • Java
  • for文の実行結果について

    public class Trace3 { public static void main(String[] args) { for (int i = 1; i < 4; i++) { for (int j = 1; j <= i; j++) { System.out.print(" " + (i * j)); } System.out.println(); } } } 実行結果は 1 2 4 3 6 9 になります。 i < 4でiは4より小さいで123は解るのですが、 j <= iでjはiより小さくjを含むで何故469になるのですか?

    • ベストアンサー
    • Java
  • 昇進者です。 戻り値の学習をしていますが。

    *を10個表示するプログラムですが。 public class Graph1 { public static void main(String[] args) { printGraph(10); } public static void PrintGraph(int x) for(int i = 0; i < x; i++){ System.out.println("*"); } System.out.println(""); } } のprintGraph(10);は何のためにあるのですか? 10がxに代入されていますよね。戻り値はxですか。

  • java九九表示

    package kuku; public class Kuku { public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ // 配列の宣言をする。 int[][] x = new int[9][9]; // 九九の結果を配列に保存する。 for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { x[i][j] = (i + 1) * (j + 1); } } // 九九の結果を表示する。 for (int i1 = 0; i1 < 9; i1++) { for (int j1 = 0; j1 < 9; j1++) { System.out.print(String.format("x" + args, x)); } // 改行する。 System.out.println(); } } } _________________________________ 九九の表示ができません。 String.formatも使いたいのですが、使い方がわかりません。 String.formatも使って九九を表示させるにはどうしたらいいのか教えてください。 お願いいたします。

  • for文について

    for文を使って、以下のような図形を作成してますが、 どうしてもうまく作れません。 どなたか教えていただけないでしょうか? 現在出来ているソースは次のようです。 まるで異なる図形になってしまいますが。 public class kurikaeshi { public static void main(String[] args) { int i = 0, j = 0, k = 0, l=0; for(i = 0; i < 10; i++) { for(j = 0; j < i + 1; j++) { for(k = 0; k < 2*j; k++) { System.out.print(" "); } for(l = 0; l < (2*i + 1) - 2*k; l++) { System.out.print("*"); } System.out.println(); } } } } + +++ + +++++ +++ + +++++++ +++++ +++ + +++++++++ +++++++ +++++ +++ + +++++++++++ +++++++++ +++++++ +++++ +++ +

  • javaのfor文

    nの値の和を求めるのはこれ以外に書き方はありますか? import java.util.*; class SampleGoo{ public static void main(String args[]){ Scanner std = new Scanner(System.in); System.out.print("整数値:");int n = std.nextInt(); int ans = 0; for (int i = 1;i <= n;i++){ ans = ans + i; } System.out.println(Integer.toString(ans)); } }

  • javaのfor文

    nの値の和を求めるのはこれ以外に書き方はありますか? import java.util.*; class SampleGoo{ public static void main(String args[]){ Scanner std = new Scanner(System.in); System.out.print(\"整数値:\");int n = std.nextInt(); int ans = 0; for (int i = 1;i <= n;i++){ ans = ans + i; } System.out.println(Integer.toString(ans)); } }

  • javaの問題

    import java.util.Scanner; class test6{ static void printArray(int[] a) { for(int i=0;i<a.length;i++) System.out.print(String.format("%1$6s", (a[i]+" "))); System.out.println(); } static void printArray(int[][] a) { for(int[] i:a) { for(int j:i) System.out.print(String.format("%1$6s",(j+"\t"))); System.out.println(); } } public static void main(String[] args) { int[] a = {12,536,-8,7}; int[][] c = {{32,-1,32,45,67}, {535,99999,2}, {2,5,-123,9}}; printArray(a); printArray(c); } } このプログラムを表示するとこのようになるのですが、 12 536 -8 7 32 -1 32 45 67 535 99999 2 2 5 -123 9 これに一工夫加えて見やすくしたいです。 このような形にするのはどのようにすればよいのでしょうか + + | 32 -1 45 67 | | 535 99999 2 | | 2 5 -123 9 | + +

専門家に質問してみよう