我想知道如何switch
-case
语句执行:
Example
假设有以下代码:
Scanner sc = new Scanner(System.in);
int v = sc.nextInt();
switch(v) {
case 0 :
System.out.println("Zero");
break;
case 1 :
System.out.println("One");
break;
case 2 :
System.out.println("Two");
break;
//...
default :
System.out.println("No one digit number");
}
可以将其实现为:
if(v == 0) {
System.out.println("Zero");
}
else if(v == 1) {
System.out.println("One");
}
else if(v == 2) {
System.out.println("Two");
}
//...
else {
System.out.println("No one digit number");
}
但更有效的方案是:
if(v >= 0 && v <= 9) {
if(v <= 5) {
if(v <= 2) {
if(v <= 1) {
if(v == 0) {
System.out.println("Zero");
}
else {
System.out.println("One");
}
else {
System.out.println("Two");
}
}
//...
}
//...
}
else {
System.out.println("No one digit number");
}
这一点很重要,因为有些程序(如编译器编译器)会编写 Java/C#/C++ 源代码,从而生成非常大的 switch 语句。
Switch/case 语句根据 case 范围,使用二元决策树和跳转表的组合来实现。
对于简单的 switch 语句(2 - 3 种情况),发出简单的 if 语句通常更有效,具体取决于值的密集程度(例如 1 2 3 与 1 2 9)。
对于具有单个密集组的较大基数切换,通常使用直接或间接基于测试值的跳转表。
对于稀疏组或密集组和稀疏组的混合,二元决策树用于平分组列表,并在组内使用跳转表(树的叶子)。
所以答案是,是的,有时,但不是那么简单。
可以用默认跳转填充“空”案例槽,以允许构建密集范围。对于小型分支或针对非整数值的分支,开关将被重写,就像条件语句一样(例如允许在字符串或正则表达式上进行切换的语言)。在您的示例中,数字 0-9 的情况肯定会被编码为查找表,因为它是一个密集组。
在所有情况下,二元决策树都是发出高效 switch / case 结构的重要组成部分。
.NET CLR 甚至有一个接受跳转表的操作码,它隐藏了默认情况的处理,这允许运行时验证代码是否安全,而无需进行完整的流程分析。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)