为什么if块中的代码以任何方式执行?
switch(v)
{
case a:
break;
...
if(condition)
{
case f:
...
break;
case g:
...
break;
}
...
case z:
...
break;
default:
}
答案 0 :(得分:9)
C ++编译器使用查找表或直接分支到case
- 语句。忽略您的if
- 声明。由于break
,case a
也无法访问它。
长答案很短,你不能'关闭'case
- 使用这种方法的陈述。
相反,你需要这样的东西:
switch(v) {
case a :
break;
//...
case f :
if(condition) {
//...
}
break;
case g :
if(condition) {
//...
}
break
//...
case z :
break;
}
答案 1 :(得分:2)
case
标签,顾名思义,是一个实际标签,与goto
标签非常相似:执行线程只是跳转到它。它的结构并不重要,除非该结构是另一个嵌套的switch
语句。
它的工作方式与此相同:
if (v == f)
goto f_label;
if (condition) {
f_label:
// ...
}
无论f_label:
是否为真,执行线程都会跳转到condition
标签。 switch
标签的工作方式相同。
答案 2 :(得分:1)
交换机的case子句非常灵活,你可以为它们做一些hacks
。我看到有些人使用switch来打破嵌套的for循环。仍然在上面的示例中,如果v是f
或g
,则交换机将跳过if语句,并且在切换后将立即执行该案例中的代码。
答案 3 :(得分:1)
当程序正在编译switch
时,会构建一些表从一个case
跳转到另一个switch
。这会以某种方式忽略其他条件操作。 BTW根据这种行为if-else
比长{{1}}块快。
答案 4 :(得分:1)
我认为最好的答案是(灵感来自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
}
答案 5 :(得分:0)
切换跳转到匹配的大小写,忽略其间的所有语句。您有两种方法可以完成您打算做的事情(取决于您必须实施的案例数量):
if条件
下的更多案例的方法1 if(condition) {
switch(v) {
case f :
....
break;
//...
case g :
....
break;
//...
case z :
break;
}
switch(v) {
case a :
....
break;
//...
}
方法2,用于if条件
下的较少案例 switch(v) {
case a :
break;
//...
case f :
if(condition) {
//...
}
break;
case g :
if(condition) {
//...
}
break
//...
case z :
break;
}