通过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块放在6
的7
的末尾,可能会让警卫检查你是在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; }