3
class switch1
{
    public static void main(String args[])
    {
        int a = 10;
        switch(a)
        {
            default: System.out.println("Default");
            case -1: System.out.println("-1");
        }
    }
}

このプログラムは、一致する条件の後 (この場合は "default" の後) に break が指定されていないため、"default" ステートメントと "case -1" ステートメントの両方を実行することを理解しています。

しかし、私が理解できないのは

a) なぜステートメントbreakで が必要なのですか?switch

b) 一致するだけなのに、無効な一致条件のステートメントを実行する (つまり、「case -1」を実行する) のはなぜですか?

4

9 に答える 9

14

同じ関数を実行するために複数のケースが必要な場合があります。たとえば、ユーザーがモード 1 またはモード 32 を指定して 32 ビット モードを表し、モード 2 またはモード 64 を 64 ビット モードとして指定できるようにしています。

switch (input) {

    case 1:
    case 32:
        /* Do 32-bit related code */
        break;
    case 2:
    case 64:
        /* Do 64-bit related code */
        break;
    default:
        System.out.println("Invalid input");

}

だからこそ、休憩は重要です。これらは、特定のシナリオのコードの実行をいつ停止するかを switch ステートメントに伝えます。さらに、デフォルトは通常、スイッチがどのケースにも一致しない場合に使用されます。

于 2013-08-22T04:30:13.533 に答える
1

a) switch ステートメントが目的を達成するために break ステートメントに大きく依存しているのはなぜですか?

それが彼らがそれを定義した方法だからです。C からのコピーです。Pascal にはフォールスルーがないため、ブレークもありません。また、Java にはないケース範囲もあります。言語が異なっていてもかまいません。または同じ。

b) 無効な一致条件のステートメントを実行するのはなぜですか (つまり、「case -1」を実行します))

それが彼らが定義した方法であり、休憩を入れなければフォールスルーするからです。

一致するだけの場合は?

質問がわかりません。マッチングはしません。関連するケースへのインデックス付きジャンプを行い、休憩を入れなければ次のステートメントにフォールスルーします。

于 2013-08-22T06:15:03.403 に答える
1

a. についてはbreak、下部ブロックに共通コードを配置できる簡略記法を使用する必要があります。これにより、コードが読みやすくなる場合があります。

フォールスルーの詳細については、「C# での Switch ステートメントのフォールスルー?」を参照してください。

b.については、default大文字と小文字が一致するため、その行が実行されます。そのブロックにはnobreakが存在するため、一致に関係なく次の行も実行されます。

試す

switch (a)
{
    case 10: System.out.println("This is 10.");
    case 9 : System.out.println("This is 9.");
             break;
    case 8 : System.out.println("This is 8.");
             break;
    default: System.out.println("Default");
}

一致する場合にブレークがないため、出力は

This is 10.
This is 9.

aこれを 11、9 、または 8 に設定した場合と比較してください。

于 2013-08-22T04:30:02.797 に答える
0

ループにブレークを追加すると、ループからキャンセルされます。そのため、switch ステートメントの場合、正しいケースに移動し、breakそこに到達すると、switch ステートメントを終了する場所までコードを実行します。ブレークを削除すると、ブレークが表示されるcaseまで次のブレークに進みます。存在しない場合break;、コードはクラッシュします。

したがって、基本的には異なるケースを分離します

于 2013-08-22T04:31:13.570 に答える
0

a) なぜフォールスルー / スイッチの中断が必要なのですか?

フォールスルー動作が役立つ場合もありますが、一般的なケースでは余分な作業が必要になるという問題があります。したがって、より現代的な言語では「break」キーワードは必要ないと考えるのが妥当です。

では、なぜそこにあるのでしょうか。C++ (Java が設計された時点での主要言語) の動作に一致させるため。これは、C (C++ が設計された時点での主要言語) の動作と一致します。Cに関しては、それ(およびBとBCPL、その前身)は通常、効率的なコンパイラを構築しやすくするための方法に見えます. 基本的に、switch ステートメントが機能する方法は、アセンブラーで実装する自然な方法です。

b) その動作は、フォールスルーを使用するという決定から論理的に導かれます。

于 2013-08-22T05:55:40.743 に答える