2

私はJavaの初心者で、練習中にこれらのエラーに出くわしたので、エラーを回避するためにエラーを覚えようとするのではなく、それらを明確にすることを考えました.

public static int gcd(int a, int b) {
  if(a > b) {
    int result = a % b;
  }
  return result;
}

これは私を生成しますが、ループのようにa cannot find symbol結果を初期化すると思いましたか?intif

public static int gcd(int a, int b) {
  if(a > b) {
    int result = a % b;
    return result;
  }
}

これに対してifループで結果を返すと、ループし続けて間違っているのでしょうか?

public static int gcd(int a, int b) {
  int result = 0;
  if(a > b) {
    result = a % b;
  }
  return result;
}

ifループの外側で結果を宣言すると、エラーはなくなります。何故ですか?

4

3 に答える 3

4

これは、変数のスコープに関連していますresult。の中にあったときは、 ( の)ifを出ると存在しなくなりました。if}

public static int gcd(int a, int b){
    int result = 0;
    if (a > b) {
        result = a % b;
    }
    return result;
} // result exists until here

public static int gcd(int a, int b){
    if (a > b) {
        int result = a % b;
    } // result exists until here
    return result; // result doesn't exist in this scope
} 

基本的に、変数が定義されているコード ブロック内の変数にのみアクセスできます。コード ブロックは中括弧で定義されます{ ... }

関数の代替実装は、変数をまったく使用せずに実行できます。

public static int gcd(int a, int b){
    if (a > b) {
        return a % b;
    }
    return 0;
} 
于 2013-03-10T06:33:39.053 に答える
1

ローカル変数は、作成されたブロック内でしか見ることができないため、ローカルと呼ばれます。

ブロックは 内の任意のコード{ ... }です。

最初のバージョンのブロックを見てみましょう:

public static int gcd(int a, int b) { // first block starts here
  if(a>b) { // second block, an inner block, starts here
      int result=a%b;
  } // second block ends here
  return result;
} // first block ends here

したがって、 2 番目のブロックでローカル変数を作成し、それをそのブロックの外側、つまり最初のブロックで使用しようとします。それがコンパイラが不平を言っていることです。変数の種類は、 2 番目のブロックが終了resultした後に消えました。

于 2013-03-10T06:33:02.343 に答える
0

最初のエラーの理由は、ifステートメントが変数の新しいコンテキストを確立することです。の宣言はresult、 の本体の外側には表示されませんif

2 番目のケースでは、if条件が満たされない可能性があり、その場合、関数はreturnステートメントを実行しません。int関数は実行パスごとに を返す (または例外をスローする) 必要があるため、これもエラーです。

于 2013-03-10T06:34:18.243 に答える