3

这会是法律法规还是违反任何规则?

switch (expr)
{
    do
    {
        case 6:
            /*...*/

            if (/*...*/)
                break;
        case 7:
            /*...*/

    } while (0);    

    case 9:
        /*...*/

        break;

    default:
        break;
}

这是否是执行案例 6 后执行案例 7 的合法方式,但前提是满足某些条件?或者这会导致不确定的行为并让鼻龙摆脱开关?ps我的问题是指c99。

编辑:

我想要做的是:假设,案例9,必须在每个案例中执行。如果 expr 是 6,我必须执行 6,在某些条件下是 7,然后是 9,或者如果 expr 是 7,它的 7->9 所以如果满足某些条件,我只想跳过 7,但我不能更改 6 的顺序,7,9。

编辑2:

我不是在寻找替代解决方案,我只是对这个片段的行为感兴趣。

如果 switch 语句在具有可变修改类型的标识符范围内具有关联的 case 或默认标签,则整个 switch 语句应在该标识符的范围内。

来自 ISO/IEC 9899:TC3 6.8.4.2->3

让我不确定它的行为。但我不确定它是否也会像我的代码片段一样瞄准代码。

4

3 回答 3

1

虽然我相信上面的代码是有效的,但我会更明确地说:

case 6:
   ... 

   /* fall through */
case 7:
   if (expr != 6 || condition_to_run_7)
   {
       do whatever 7 does;
   }
   if (should_not_do_9)

case 9:
   ... 
   break;

}

或者,这是更清洁的解决方案:将 6、7 和 9 案例的功能移动到单独的函数中,并在 switch 语句中调用相关函数(如果需要,不止一次),并在每个案例之后都有适当的“中断” ...

于 2013-08-13T13:58:28.830 回答
1

也许我是那些糟糕的程序员之一。我不确定标准,但在需要时我一直在做类似的事情。也就是说,如果我想做你在问题中所说的,我会做这样的事情:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
    int iCnt, iTmp;

    for(iCnt = 1; argc > iCnt; iCnt ++)
    {
        iTmp = (int) strtol(argv[iCnt], NULL, 10);

        switch(iTmp)
        {
            case 6:
                printf("Case 6\n");

            /* change this condition to whatever suits you */
            if (argc - 1 == iCnt)
            {
            case 7:
                printf("Case 7\n");
            }

            case 9:
                printf("Case 9\n");
            default:
                printf("Default case\n");
        }

        printf("\n");
    }

    return 0;
}

即 if 语句在这里 IMO 更为内在。

于 2013-08-13T14:12:23.547 回答
0

有效是;做你想做的事?我对此表示怀疑。

假设break您输入的 s 是唯一的,然后假设编译器没有进入完整状态(坦率地说,这并不令人难以置信,特别是如果您进行了优化),那么将发生以下情况

case 9::运行它的块并继续 default:运行它的块并继续 case 7:永远重复运行它的块 case 6:运行它的块,也许是 7,永远重复

要执行您想要的操作,请删除 do..while,并将 if 块6放在7.

switch (expr)
{
    case 6:
        /*...*/       
            break;
    case 7:
      if ( expr==7 || !/*...*/)
      { 
        /*...*/
      }
    case 9:
        /*...*/

        break;

    default:
        break;
}

然而,我不会这样做。这可能是将其包装到子函数中是有意义的:

void handle6() { /*...*/ }
void handle7() { /*...*/ }
void handle9() { /*...*/ }

switch (expr)
{
  case 6:
    handle6();
    if( /*...*/ ) handle7();
    handle9();
    break;
  case 7:
    handle7();
  case 9:
    handle9();
    break;
  default:
    /*...*/
}

是另一种可能更清楚的方式。

并且为了完整性...

switch( expr )
{
    case 6:
        /*...*/
        if( /*...*/ ) goto case_9;
    case 7:
        /*...*/
    case 9:
case_9:
        /*...*/
        break;
    default:
        break;
}
于 2013-08-13T13:52:23.800 回答