3

次のコードがある場合、else ifコードで日食の警告が正しく表示されます:

final int x = 8;
if (x < 10) {
    System.out.println(x);
} else if (x < 5) {
    System.out.println(x);
}

ただし、回線を交換しても警告は表示されません

final int x = 8;

final int x = getX();

getX()どこかで定義されています。

これの理由は何ですか?

4

7 に答える 7

11

JVMxはコンパイル時に常に10未満になることを知っていますが、x宣言を置き換えると

final int x = getX();

JVMx実行時にのみ比較する値を認識します

関連する質問:

于 2013-03-05T18:41:37.693 に答える
3
final int x = 8;
    if (x < 10) {
        System.out.println(x);
    } else if (x < 5) {
        System.out.println();
    }

ここでは、値を8として宣言しました。

したがって、ifが実行されます。elseを実行する可能性はありません。

しかし、2番目のケースでは、最初に値がわかりません。実行時にのみ、値がわかります。

于 2013-03-05T18:41:24.260 に答える
0

あなたが書く場合final int x = 8;、コンパイラはそれを確実に知ってx < 10おり、ifブランチは常に実行されますが、2番目のケースでは、呼び出された関数によって返される値を知ることができません。

于 2013-03-05T18:41:40.473 に答える
0

コンパイル時に、コンパイルはxが常に8になることを認識します。ただし、関数を使用する場合、その関数にドリルダウンすることはありません。

于 2013-03-05T18:41:51.820 に答える
0

最後のプリミティブはコンパイル時定数であるため、コンパイル時に到達不能コードチェックを実行できます。この場合、コンパイラーx = 8はifステートメントの結果を認識し、それに応じて判別できます。

このgetX()アプローチでは、コンパイル時にそのチェックは行われません。これは、その警告が表示されないことを意味します。

于 2013-03-05T18:42:03.640 に答える
0
if (8 < 10) {
  //Executing code
} else {
  if (8 < 5) {
    //Alternative code
  }
}

これは、コンパイラがコードを読み取る方法と本質的に同等であると思います(私が修正できるよりも多くの知識を持っている人。それをスクラッチしてください。彼らは私を修正できると確信しています)。

そうは言っても、ステップの論理シーケンスを見ると、コンパイラーが実行のステップをすでに決定しており、2番目のifが決して満たされないことを決定できることがわかります。代わりに使用する場合getX()、コンパイラはそれらの仮定を行うことができません。

于 2013-03-05T18:43:11.093 に答える
0

これがx<5の場合

次に、これはx<10も保持します。

したがって、xの値が不明であっても、2番目の部分は実行されません。

于 2013-03-05T18:50:08.333 に答える