让我们看一个简单的开关盒,如下所示:
@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
有什么背景不接受这个运营商?
老兄喜欢这样
case R.id.someValue :
case R.id.someOtherValue :
//do stuff
这与在两个值之间使用 OR 运算符相同 由于这种情况,操作员不在开关盒中
switch-case不接受该操作员的背景是什么?
因为
case
需要常量表达式作为其值。并且由于 ||
表达式不是编译时常量,因此是不允许的。
来自 JLS 第 14.11 节:
开关标签应具有以下语法:
开关标签:
case 常量表达式:
案例枚举常量名称:
默认:
只允许带有 case 的常量表达式背后的原因可以从 JVM 规范第 3.10 节 - 编译开关理解:
switch 语句的编译使用 tableswitch 和 lookupswitch 指令。当切换的情况可以有效地表示为目标偏移表的索引时,使用表切换指令。如果开关表达式的值超出有效索引范围,则使用开关的默认目标。
因此,对于
tableswitch
使用的 case 标签作为目标偏移量表的索引,case 的值应该在编译时已知。仅当 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
指令将其索引到指令指针表中。
您不能使用||两种情况之间的运算符。但是您可以使用多个大小写值,而无需在它们之间使用分隔符。然后程序将跳转到相应的情况,然后查找要执行的代码,直到找到“中断”。因此,这些案例将共享相同的代码。
switch(value)
{
case 0:
case 1:
// do stuff for if case 0 || case 1
break;
// other cases
default:
break;
}
我不知道最好的方法,但我这样做
case 'E':
case 'e':
System.exit(0);
break;
Switch 与 if-else-if 不同。
当有一个表达式被计算为一个值并且该值可以是预定义的一组值之一时,使用 Switch。如果您需要在运行时执行多个布尔/比较操作,则需要使用 if-else-if。
自 Java 12 起,在以下情况下可以有多个值:
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.someValue, R.id.someOtherValue:
// do stuff
break;
}
}
或
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.someValue, R.id.someOtherValue -> {/* do stuff */}
}
}
你还可以这样做。
switch (v.getId()) {
case R.id.someValue: case R.id.someOtherValue:
// do stuff
break;
}
尝试使用增强的“开关”
开关(值) { case R.id.someValue, R.id.someOtherValue -> //do stuff
}
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;
}
}
这对于支持封装的语言来说效果很好
在某些情况下有帮助。
switch(true){
case a == b: break;
case a == 2 || a == 3: break;
default: break;
}