2

为什么 if 块中的代码以任何方式执行?

switch(v)
{
case a:
    break;
...
if(condition)
{
    case f:
        ...
        break;
    case g:
        ...
        break;
}
...
case z:
    ...
    break;
default:
}
4

6 回答 6

9

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;
}
于 2013-01-14T15:30:37.930 回答
2

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.

于 2013-01-14T15:37:35.070 回答
1

当程序正在编译时,switch会构建一些表以从一个跳转case到另一个。这会以某种方式忽略其他条件操作。BTW 根据这种行为switch比长if-else块更快。

于 2013-01-14T15:32:58.030 回答
1

switch 的 case 子句非常灵活,您可以hacks为它们做一些事情。例如,我看到有些人使用 switch 来跳出嵌套的 for 循环。仍然在上面的示例中,如果 v 是f或者gswitch 将跳过 if 语句,并且 case 中的代码将在 switch 之后立即执行。

于 2013-01-14T15:28:57.793 回答
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
}
于 2013-01-14T16:12:42.447 回答
0

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;
}
于 2013-01-14T15:40:35.260 回答