6

昨夜のSCJP認定を読んだ後、switchステートメントと式の評価方法について考えましたが、少し戸惑いました。

Javaではブール値をオンにできないため、以下はコンパイルされません。

public static void switchOnBoolean(boolean theBool)
    {
        System.out.println("\n\nAssessing boolean :" + theBool);
        // line below won't compile, since booleans are not valid for the switch statement
        switch(theBool)
        {
            case true:
            {
                System.out.println("The boolean was true");
                break;
            }
            case false:
            {
                System.out.println("The boolean was false");
            }
        }
    }

ただし、次のようなケースブロックでブール値に評価される式を使用しようとしても、コンパイラは文句を言いません。

public static void switchOnChar(char theChar)
    {
        System.out.println("\n\nAssessing char : " + theChar);
        switch(theChar)
        {
            case 'a':
            {
                System.out.println("The char was a");
                break;
            }
            case 'b':
            {
                System.out.println("The char was b");
                break;
            }
            case ('c' | 'd'):
            {
                System.out.println("The char was c or d");
                break;
            }
            default:
            {
                System.out.println("The char didn't match anything, must be something else");
            }
        }
    }

('c' | 'd')最終的には、ブール値と評価される可能性があるため、このケースに入ることができません...

だから私の質問は:

  1. なぜのようなものを使用することが合法('c' | 'd')ですか?
  2. 到達できないので、どうしてそれが役立つのでしょうか。
  3. 複数の値をケースに入れたいが、デフォルトを使用しない場合、if-elseステートメントとして再実装する唯一の選択肢はありますか?
4

4 に答える 4

12

'c' | 'd'ブール値を返しません。この場合|、ビット単位の OR はブール OR ではありません。

この例で、それがどのように計算されるかを見ることができます

System.out.println(Integer.toBinaryString('c'));
System.out.println(Integer.toBinaryString('d'));
System.out.println("=======");
System.out.println(Integer.toBinaryString('c' | 'd'));

出力

1100011
1100100
=======
1100111

2 進数の 1100111 は 10 進数の 103 の整数に等しいため、有効なケース引数です。

于 2012-08-08T10:36:26.357 に答える
6

'c' | 'd'はビットごとの or であり、その結果は'g'になるため、スイッチで有効です。

if ステートメントに行かなくても、複数のケースに一致させることができます

switch(theChar) {
    case 'a':
        break;
    case 'b':
        break;
    case 'c':
    case 'd':
        System.out.println("c or d");
        break;
    default:
        throw new IllegalStateException();
}
于 2012-08-08T10:41:06.507 に答える
4
('c' | 'd')

ビット単位であるか、ブール値を返さないため、完全に有効です。

試してみると、次のようになります。

System.out.println('c' | 'd');

gの ASCII コードである 103 が出力されます。

于 2012-08-08T10:36:58.313 に答える
1

そうすると、予想されるブール値エラーが発生し、コンパイルされませ'c' || 'd'ん。

'c' | 'd'bitwise OR

于 2012-08-08T10:40:07.757 に答える