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");
            }
        }
    }

但是,如果您尝试在 case 块中使用计算结果为布尔值的表达式,编译器不会抱怨,例如:

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'不会返回布尔值。在这种情况下|是按位或而不是布尔或。

你可以在这个例子中看到它是如何计算的

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

并且二进制 1100111 等于 103 十进制整数,因此它是有效的case 参数。

于 2012-08-08T10:36:26.357 回答
6

'c' | 'd'是按位或导致'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');

它将打印出 103 ,这是g的 ASCII 码。

于 2012-08-08T10:36:58.313 回答
1

如果你这样做了,'c' || 'd'那么你会得到预期的布尔错误并且不会编译。

'c' | 'd'bitwise OR

于 2012-08-08T10:40:07.757 回答