开关盒中的OR运算符?

时间:2013-08-23 22:41:27

标签: java switch-statement

让我们看一个简单的开关案例,如下所示:

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.someValue :
        case R.id.someOtherValue:
            // do stuff
            break;
    }
}

我想知道为什么不允许使用||运算符?像

switch (v.getId()) {
    case R.id.someValue || R.id.someOtherValue:
        // do stuff
        break;
}

switch-case构造与if-else语句非常相似,但您可以在if中使用OR运算符。 switch-case不接受此运算符的背景是什么?

6 个答案:

答案 0 :(得分:29)

  

交换机案例不接受此运营商的背景是什么?

因为case需要常量表达式作为其值。由于||表达式不是编译时常量,因此不允许使用。

来自JLS Section 14.11

切换标签应具有以下语法:

  

SwitchLabel:
      case ConstantExpression:
       case EnumConstantName:
       默认:


引擎盖下:

JVM Spec Section 3.10 - Compiling Switches

可以理解允许对案例进行持续表达的原因
  

switch语句的编译使用 tableswitch lookupswitch 指令。当交换机的情况可以有效地表示为目标偏移表中的索引时,使用tableswitch指令。如果开关表达式的值超出有效索引的范围,则使用开关的默认目标。

因此,对于tableswitch使用的case标签作为目标偏移表的索引,应该在编译时知道该案例的值。只有在案例值是常量表达式时才有可能。并且||表达式将在运行时进行评估,并且该值仅在那时可用。

从同一JVM部分,以下switch-case

switch (i) {
    case 0:  return  0;
    case 1:  return  1;
    case 2:  return  2;
    default: return -1;
}

编译为:

0   iload_1             // Push local variable 1 (argument i)
1   tableswitch 0 to 2: // Valid indices are 0 through 2  (NOTICE This instruction?)
      0: 28             // If i is 0, continue at 28
      1: 30             // If i is 1, continue at 30
      2: 32             // If i is 2, continue at 32
      default:34        // Otherwise, continue at 34
28  iconst_0            // i was 0; push int constant 0...
29  ireturn             // ...and return it
30  iconst_1            // i was 1; push int constant 1...
31  ireturn             // ...and return it
32  iconst_2            // i was 2; push int constant 2...
33  ireturn             // ...and return it
34  iconst_m1           // otherwise push int constant -1...
35  ireturn             // ...and return it

因此,如果case值不是常量表达式,编译器将无法使用tableswitch指令将其索引到指令表的表中。

答案 1 :(得分:24)

老兄喜欢这个

    case R.id.someValue :
    case R.id.someOtherValue :
       //do stuff

这与在两个值之间使用OR运算符相同 由于这种情况,操作员不在开关盒中

答案 2 :(得分:9)

您不能使用||运算符在2种情况下。但是您可以使用多个大小写值,而无需在它们之间使用分界符。然后,程序将跳转到相应的情况,然后它将寻找要执行的代码,直到找到“中断”为止。结果,这些案例将共享相同的代码。

switch(value) 
{ 
    case 0: 
    case 1: 
        // do stuff for if case 0 || case 1 
        break; 
    // other cases 
    default: 
        break; 
}

答案 3 :(得分:1)

Switch与if-else-if不同。

当有一个表达式被计算为一个值并且该值可以是一组预定义值时,使用。如果你需要执行多个布尔/比较操作运行时,那么if-else-if需要使用。

答案 4 :(得分:1)

我不知道最好的方法,但我是这样做的

case 'E':
case 'e':
   System.exit(0);
   break;

答案 5 :(得分:-1)

foreach (array('one', 'two', 'three') as $v) {
    switch ($v) {
        case (function ($v) {
            if ($v == 'two') return $v;
            return 'one';
        })($v):
            echo "$v min \n";
            break;


    }
}

这适用于支持附件的语言