通过false循环跳过switch case是一种有效的操作?

这是合法代码还是违反任何规则?

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。

EDIT2:

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

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

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

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

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

 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语句中调用相关函数(如果需要,多次调用),并在每个案例后进行适当的“中断” …

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

 #include  #include  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中更为内在。

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

假设您放入的break唯一的,那么假设编译器没有进入完整状态(坦率地说并非难以置信,特别是如果您已经进行了优化),那么将会发生以下情况

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

要做你想做的事,删除do..while,然后将if块放在67的末尾,可能会让警卫检查你是在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; }