为什么 if 块中的代码以任何方式执行?
switch(v)
{
case a:
break;
...
if(condition)
{
case f:
...
break;
case g:
...
break;
}
...
case z:
...
break;
default:
}
为什么 if 块中的代码以任何方式执行?
switch(v)
{
case a:
break;
...
if(condition)
{
case f:
...
break;
case g:
...
break;
}
...
case z:
...
break;
default:
}
C++ 编译器使用查找表或直接分支到 -case
语句。忽略你的if
-statement。由于break
它也无法从 到达case a
。
case
长回答简短,您不能使用此方法“关闭”语句。
相反,你需要这样的东西:
switch(v) {
case a :
break;
//...
case f :
if(condition) {
//...
}
break;
case g :
if(condition) {
//...
}
break
//...
case z :
break;
}
A case
label, as the name implies, is an actual label and works very similar to a goto
label: the execution thread just jumps to it. It does not matter what structure it is in, unless that structure is another, nested switch
statement.
It works the same way as this:
if (v == f)
goto f_label;
if (condition) {
f_label:
// ...
}
The execution thread will jump to the f_label:
label regardless of whether condition
is true or not. switch
labels work the same way.
当程序正在编译时,switch
会构建一些表以从一个跳转case
到另一个。这会以某种方式忽略其他条件操作。BTW 根据这种行为switch
比长if-else
块更快。
switch 的 case 子句非常灵活,您可以hacks
为它们做一些事情。例如,我看到有些人使用 switch 来跳出嵌套的 for 循环。仍然在上面的示例中,如果 v 是f
或者g
switch 将跳过 if 语句,并且 case 中的代码将在 switch 之后立即执行。
我认为最好的答案是(灵感来自 Nikos C. 的答案):
switch(v)
{
case a:
break;
case z:
...
break;
default:
if(condition)
{
switch(v)
{
case f:
...
break;
case g:
...
break;
default:
//former default
}
}
else
//former default
}
Switch 跳转到匹配的大小写,忽略其间的所有语句。您有两种方法来完成您打算做的事情(取决于您必须实施的案例数量):
方法 1 在 if 条件下的更多案例
if(condition) {
switch(v) {
case f :
....
break;
//...
case g :
....
break;
//...
case z :
break;
}
switch(v) {
case a :
....
break;
//...
}
if条件下较少情况的方法2
switch(v) {
case a :
break;
//...
case f :
if(condition) {
//...
}
break;
case g :
if(condition) {
//...
}
break
//...
case z :
break;
}