4

Java および Eclipse (Kempler) の最新の安定版リリースでは、パッケージ名とクラス名が存在すると仮定して、次のコードを入力して実行します。

package some_package;

public class what_the_heck {

    public static void main(String[] args) {
        int p = 2;
        int x = 1;
        switch(p){  
            case (1):
                x--;
            case (2):
                x = 2;
            case (3):
                x = 3;
            default:
                x++;
        }
        System.out.println(x);
    }
}

これにより、値 4 が出力されます。最初は、break ステートメントがなくても、コードの各部分が case ステートメントに保持されていると考えたため、2 を出力する必要があると考えていました。今、問題はそれをどのようにコンパイルするかにあると思います。たとえば、私の現在の信念は、ケース ステートメントが値と等しいかどうかをブール値が内部的に追跡しているということです。そうであれば、ブール値は true であり、すべての case ステートメントは、ブレークが見つかるまでtrue として扱われます。これは理にかなっていますが、この背後に他の理由があるのか​​ 、それとも私の仮定が完全に間違っているのか、まだ疑問に思っています.

4

4 に答える 4

5

switch がこのように機能する理由は、次のとおりです。

switch(p){  
        case (1):
            x--;
        case (2):
            x = 2;
        case (3):
            x = 3;
        default:
            x++;
    }

これは、(基本的に) 単なるシンタックス シュガーです。

if (p == 1)
    goto .L1;
else if (p == 2)
    goto .L2;
else if (p == 3)
    goto .L3;
else
    goto .L4;

.L1:
    x--;
.L2:
    x = 2;
.L3:
    x = 3;
.L4:
    x++;

Java にはステートメントがありませんが、gotoC にはステートメントがあります。が 2 の場合、そのラベルに続くすべてのステートメントpにジャンプして実行します。.L2

于 2013-11-05T19:16:14.863 に答える
3

スイッチを配置しないbreak場合、エントリ ポイントの下にある他のすべてのケースが実行されます。

したがって、実際に実行されます

 x = 2;
 x = 3;
 x++;
 print(x);
 System.out.println(x);

Tks to Pshemo here は、switch ステートメントの仕様へのリンクです。

于 2013-11-05T19:06:18.717 に答える
0

後続のすべてのケースをスキップする場合は、このケース ブロックの最後に配置する必要があります。そうしないとbreak;、後続のすべてのケース ブロックも実行されます。

ご覧ください: http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html

于 2013-11-05T19:07:00.337 に答える