让我们看一个简单的开关案例,如下所示:
@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
不接受此运算符的背景是什么?
答案 0 :(得分:29)
交换机案例不接受此运营商的背景是什么?
因为case
需要常量表达式作为其值。由于||
表达式不是编译时常量,因此不允许使用。
切换标签应具有以下语法:
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不同。
当有一个表达式被计算为一个值并且该值可以是一组预定义值时,使用
答案 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;
}
}
这适用于支持附件的语言