以下是dbInterface.js
语句的示例。我不明白为什么它会这样运作:
switch
上面的程序打印:int main(){
int number1 = 100, number2 = 200;
switch(number1){
case 100:{
cout << " outer switch number is: " << number1 << endl;
case 200:{ // any value other than 100
cout << "inner switch number is: " << number2 << endl;
}
break;
}
break;
}
return 0;
}
然后打印100
的下一个语句。此外,如果在第二种情况下使用case 200
以外的任何值,它仍然会被执行。我知道200
之后没有break
。但为什么我不会收到编译时错误呢?
为了更清楚,为什么内部案例中的任何其他价值也会成功?如,
case 100
答案 0 :(得分:9)
但为什么我不会收到编译时错误?
因为你没有做任何违法的事。案例陈述只是一个带标签的陈述。评估开关中的表达式以确定要跳转到哪个标签(注意&#34;跳转&#34;和#34;标签&#34;)然后该语句开始执行。说实话,这只是伪装的转变。它有点受限制,但仍然是一个跳跃。
唯一的约束,因为这是C ++,你可能不会跳过对象的初始化跳过它。
此功能在Duff's Device中很常用(虽然在C中)。
更清楚的是,为什么内部案例中的任何其他价值也会成功?
因为跳跃后,这些标签并不重要。他们只标记具体的陈述。跳转后,执行正常进行。正常执行并不是因为它们被标记而避免使用特定的语句。
答案 1 :(得分:1)
为什么您没有看到任何编译错误?这是因为您正确使用了switch
表达式。但是,您可能无法按需查看结果。
首先让我们尝试一个简单的switch
表达式:
switch(number1){
case 100:
cout<<"the number is 100"<<endl;
break;
case 200:
cout<<"the number is 200"<<endl;
break;
default:
cout<<"the number is neither 100 nor 200"<<endl;
break;
}
如果您想使用其他号码,可以添加到switch-case
块。
如果你不使用中断意味着下一个案例是目标。直到你不使用休息程序将继续。 default
表示如果不发生以上情况,我想做这部分。
我们来看看您的计划以及发生的事情:
switch(number1){
case 100:{//if the number is 100 it will start from here
cout << " outer switch number is: " << number1 << endl;
//it will break after the first break expresion
case 200:{ // any value other than 100// if the number is 200 it will start from here
cout << "inner switch number is: " << number2 << endl;
}
break; // I meant her is the first break
}
break;
}
答案 2 :(得分:0)
switch
语句的作用类似于if
语句,但在处理超过2或3个选项时,它更受欢迎。
switch
评估case
语句中的条件。因此,每当它找到一个案例时,它认为它是一个条件,所以它继续执行,直到发现一个中断作为语句结束的标志。在你的情况下,case 100
开始,但另一个案例在里面,只要100你没有休息,它就会被执行。
case 100:
// do some stuff
case 0:
// do another stuff
case 5779:
// do ....
break;
如果仅case 100
成功,将执行上述声明。
记住在C ++中你可以写:
void foo(){
cout << "foo" << endl:
}
int main(){
b:
foo();
return 0;
}
它与label
类似,但仅限于关键字case
。您可以说case
内部案例没有switch
或break
前面的情况与label
的工作方式相同。