在 Java 和 Eclipse (Kempler) 的最新稳定版本中,输入以下代码并执行它,假设包名和类名存在:
package some_package;
public class what_the_heck {
public static void main(String[] args) {
int p = 2;
int x = 1;
switch(p){
case (1):
x--;
case (2):
x = 2;
case (3):
x = 3;
default:
x++;
}
System.out.println(x);
}
}
Run Code Online (Sandbox Code Playgroud)
这打印了值4。本来我觉得应该打印2,因为我认为即使没有break语句,每段代码仍然保存在一个case语句中。现在我认为问题在于它是如何编译的。例如,我目前的信念是内部布尔值会跟踪 case 语句是否等于该值。如果是,则布尔值为真,所有 case 语句都将被视为真,直到找到中断。这是有道理的,但我仍然想知道这背后是否有其他原因,或者我的假设是否完全错误。
switch 工作的原因是:
switch(p){
case (1):
x--;
case (2):
x = 2;
case (3):
x = 3;
default:
x++;
}
Run Code Online (Sandbox Code Playgroud)
真的只是这个(基本上)的语法糖:
if (p == 1)
goto .L1;
else if (p == 2)
goto .L2;
else if (p == 3)
goto .L3;
else
goto .L4;
.L1:
x--;
.L2:
x = 2;
.L3:
x = 3;
.L4:
x++;
Run Code Online (Sandbox Code Playgroud)
Java 没有goto声明,但 C 有,这就是它的来源。所以如果p是 2,它会跳转到.L2并执行该标签后面的所有语句。
| 归档时间: |
|
| 查看次数: |
3029 次 |
| 最近记录: |