控制switch语句中的结构

时间:2013-01-14 15:24:50

标签: c++ switch-statement

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

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

6 个答案:

答案 0 :(得分:9)

C ++编译器使用查找表或直接分支到case - 语句。忽略您的if - 声明。由于breakcase 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是fg,则交换机将跳过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;
}