2010-01-27 69 views
56

我想从switch语句的中间跳,在下面的代码的循环语句:继续使用switch语句中的

while (something = get_something()) 
{ 
    switch (something) 
    { 
    case A: 
    case B: 
     break; 
    default: 
     // get another something and try again 
     continue; 
    } 
    // do something for a handled something 
    do_something(); 
} 

这是使用continue有效的方法是什么? continue语句被switch语句忽略了吗? C和C++在这里的行为有何不同?

+0

你的想法是好的,但上述循环将不会执行'do_something()'。 – antik 2010-01-27 12:28:49

+4

即使控制达到的情况下A或情况B? – 2010-01-27 12:33:51

+13

我要说,古董店是错了。在A或B的话,那么do_something()将被执行。默认情况下它会保释。 – acron 2010-01-27 12:37:49

回答

42

它的精致,continue声明涉及封闭循环,你的代码应该等同于(避免这种跳转语句):

while (something = get_something()) { 
    if (something == A || something == B) 
     do_something(); 
} 

但是,如果你指望break退出循环,为您的评论建议(它总是再次尝试另一件事,直到它评估为假),你需要一个不同的结构。

例如:

do { 
    something = get_something(); 
} while (!(something == A || something == B)); 
do_something(); 
+1

仅在语义上“等同”。编译器生成的代码是非常不同的。与switch语句,编译器可以生成其避免多重比较,从而跳转表比由1 – chacham15 2014-02-11 17:11:45

+0

1为“继续发言涉及到封闭循环” – onmyway133 2014-06-28 17:59:11

+0

@ chacham15针对各元件1比较快的多,为什么couldn”编译器为两者生成相同的代码? – avakar 2015-02-01 18:44:56

18

是的,没关系 - 就像在if声明中使用它一样。当然,您不能使用break从交换机内部跳出循环。

+0

但是'if'对'continue'或'break'的行为没有影响。你是怎么意思的呢? – 2010-01-27 12:39:15

+0

@Matt我的意思是它会在这两种情况下继续循环。 – 2010-01-27 12:44:46

+1

@尼尔,好吧,混乱避免了。 – 2010-01-27 13:32:32

4

虽然在技术上有效,所有这些跳跃不起眼的控制流 - 尤其是continue声明。

我会用这样的把戏作为最后的手段,而不是第一个。

如何

while (something = get_something()) 
{ 
    switch (something) 
    { 
    case A: 
    case B: 
     do_something(); 
    }   
} 

它的短,以更清晰的方式履行其东西。

+1

对于亚历山大的混淆感到抱歉,代码仅用于演示,我对代码中的实际结构有很好的理由(我相信)。 – 2010-01-27 12:40:51

+2

@马特:这可能意味着一个更加模糊的结构... :) – visitor 2010-01-27 12:43:26

+0

@visitor,是它 – 2010-01-27 13:29:47

5

它的语法正确和风格上没问题。

良好的作风要求每一个case:语句应该具有以下的一个结尾:

break; 
continue; 
return (x); 
exit (x); 
throw (x); 
//fallthrough 

此外,与

case (y): 
default: 

是允许紧随case (x): - 捆绑几起案件有完全一样的效果。否则

任何被怀疑是错误的,就像if(a=4){...} 当然,你需要封闭环路(whilefordo...while)为continue工作。它不会仅循环回case()。但像这样的结构:

while(record = getNewRecord()) 
{ 
    switch(record.type) 
    { 
     case RECORD_TYPE_...; 
      ... 
     break; 
     default: //unknown type 
      continue; //skip processing this record altogether. 
    } 
    //...more processing... 
} 

......没关系。

+2

对不起necroposting,但我想补充一点,到'呼叫exit'也通常会是一件好事结束一个开关盒。 – Vality 2014-12-29 10:04:24

2

是的,继续将被switch语句忽略,并将转到要测试的循环条件。 我想通过Ritchie 分享来自The C Programming Language参考的这篇摘录。“continue语句与break有关,但使用较少;它导致下一次for,while或do循环的迭代开始。在这个过程中,这意味着测试部分立即执行;在for中,控制转到递增步骤。 continue语句仅适用于循环,不适用于切换。在循环内的一个开关内继续导致下一次循环迭代。

我不知道这一点对C++。

-1

开关不被视为循环,使你不能使用继续在交换机的情况下语句中......

+0

'switch'语句在while循环中,所以'continue'完全有效。 – Rick 2017-07-26 19:41:10