6

Java では、変数のスコープが case ブロックではなく switch ブロックに限定されているのはなぜですか。例えば、

// Scope limited to a switch block
switch (number) {
case 1:
    String result = "...";
    break;
case 2:
    result = "...";
    break;

上記の例では、結果は一度だけ宣言する必要があります。2 回宣言すると、Duplicate local variableメッセージが表示されます。

私の質問は次のとおりです。プログラムは、resultifを宣言したことをどのように認識しますかnumber = 2? (変数に分類されcase 1ず、変数を宣言しません...または宣言しますか?)

編集:

みんなを混乱させてしまうかもしれません。変数のスコープを制限する方法は理解していますが、私の質問は次のとおりです。結果がケースに該当しない場合、Javaは結果が宣言されていることをどのように認識しますか?

4

7 に答える 7

6

編集: Java は字句スコープ(静的スコープとも呼ばれます) を使用するため、変数のスコープはコンパイル時に決定され、実際の評価とは関係ありません。

Java はブロック スコープであるため、そのスコープは{}上記の例を尊重します。

JLS 6.3を参照してください。

ブロック内のローカル変数宣言のスコープ (§14.4) は、宣言が表示されるブロックの残りの部分であり、独自の初期化子から始まり、ローカル変数宣言ステートメントの右側にさらに宣言子があればそれを含みます。

于 2013-03-13T22:12:18.630 に答える
5

次のように中括弧を追加することで、スコープを case ブロックに制限できます。

// Scope limited to a switch block
switch (number) {
case 1:{
    String result = "...";
    break;
}
case 2:{
    String result = "...";
    break;
}
于 2013-03-13T22:14:36.177 に答える
3

祖先言語の Fortran には、計算された GOTO ステートメントがあります。

        GOTO expr
        ...
    1   ...
        ...
    2   ...
        ...

の値に基づいてexpr、コードは 1、2 などにジャンプします。

C (および Java) のswitchステートメントは、基本的に、偽装した計算された GOTO です。いくつかのラベルを持つ連続したコードがあり、ラベルの 1 つにジャンプします。存在しない場合breakは、残りのブロックを実行します。

このかなり低レベルの制御メカニズムは、今日のプログラマーの直感に反しています。switch ステートメントは、ステートメントと同様に、1 つの句を選択してその句を実行すると考えられますif-elseif-elseif-...-else

Java は、C からあまり逸脱したくなかったので、C のスイッチ セマンティクスを継承しました。新しい言語が間違いを続ける可能性は低いです。

于 2013-03-13T22:44:29.233 に答える
2

Java はブロック スコープを使用します。一部のケースはブロックではありません (ラベルに似ています)。これはうまくいきます:

switch (key) {
case 1: {
    String result = "1";
    return result ;
  }
case 2: {
    String result = "2";
    return result ;
  }
}
于 2013-03-13T22:12:25.977 に答える
2

どういう意味ですか?答えを理解するには、コンパイラがどのように機能するかを学ぶ必要があります。スイッチは、各スイッチ ステートメントの最後に複数の「goto」ステートメントがある大きなブロックと考えてください。

java が switch ステートメントをアンロールする方法はわかりませんが、簡単で簡単な方法の 1 つは次のとおりです (疑似バイトコード)。

    if (number == 1) goto label1;
    if (number == 2) goto label2;
    goto labelEnd;
label1:
    String result = "...";
    goto labelEnd;
label2:
    result = "...";
    goto labelEnd;
labelEnd:
    <some code>
于 2013-03-13T22:16:17.200 に答える
0

「ケースブロック」がないためです。

switch ステートメント内のすべてが同じブロックにあります。同じブロック内で同じ変数を 2 回宣言することはできません。

「ケース ブロック」が必要な場合は、{and を}自分で作成する必要があります。

于 2013-03-14T04:35:31.993 に答える
0

変数のスコープが case ブロックではなく switch ブロックに限定されている理由は、java が 1 つの case ブロックから次の case ブロックへのフォールスルーを許可しているためです。

switch (number) {
case 1:
     .... some code ...
case 2:
     .... some more code ...

この場合、number が 1 の場合、case 1 と case 2 の両方が実行されます。ブレークは、select の goto end のように機能し、スコープを終了することはありません。変数のスコープは選択レベルでなければなりません。

他の人が述べているように、ブロックを使用してスコープを制限します。

switch (number) {
case 1:{
    String result = "...";
    break;
}
case 2:{
    String result = "...";
    break;
}
于 2013-03-13T23:03:53.583 に答える