44

我注意到您确实可以continue在 switch 语句中使用关键字,但是在 PHP 上它并没有达到我的预期。

如果 PHP 失败了,谁知道还有多少其他语言也失败了?如果我经常在语言之间切换,如果代码的行为不像我期望的那样,这可能是个问题。

我应该避免continue在 switch 语句中使用吗?

PHP (5.2.17) 失败:

for($p = 0; $p < 8; $p++){
    switch($p){
        case 5:
            print"($p)";
            continue;
            print"*"; // just for testing...
        break;
        case 6:
            print"($p)";
            continue;
            print"*";
        break;
    }
    print"$p\r\n";
}
/*
Output:
0
1
2
3
4
(5)5
(6)6
7
*/

C++ 似乎按预期工作(跳转到 for 循环的结尾):

for(int p = 0; p < 8; p++){
    switch(p){
        case 5:
            cout << "(" << p << ")";
            continue;
            cout << "*"; // just for testing...
        break;
        case 6:
            cout << "(" << p << ")";
            continue;
            cout << "*";
        break;
    }
    cout << p << "\r\n";
}
/*
Output:
0
1
2
3
4
(5)(6)7
*/
4

7 回答 7

80

尝试使用continue 2继续围绕 switch 语句的循环的下一次迭代。

编辑:

    $foo = 'Hello';

    for ($p = 0; $p < 8; $p++) {
         switch($p) {
             case 3:
                 if ($foo === 'Hello') {
                     echo $foo;
                     break;
                 } else {
                      continue 2;
                 }

             default:
                 echo "Sleeping...<br>";
                 continue 2;

         }

         echo "World!";
         break;
    }

//This will print: Sleeping... Sleeping... Sleeping... Hello World!

于 2012-10-22T14:13:19.187 回答
48

PHP 7.3 或更新版本:

不推荐使用continue中断switch语句,并且会触发警告。

要退出switch语句,请使用break.

要继续围绕当前switch语句的循环的下一次迭代,请使用continue 2.

PHP 7.2 或更早版本:

continue并且break可以在 PHP 的switch语句中互换使用。

于 2012-09-10T10:35:10.367 回答
7

PHPcontinue语句的文档清楚地说明了这一点:

注意:请注意,在 PHP 中 switch 语句被认为是用于continue的循环结构。

您应该知道,不同的语言赋予相同的关键字略有不同的含义,而不是假设 PHPcontinue的行为与 C++ 相同continue

如果在无法在 C++ 中工作continue的 PHP 中有意义switch,请使用它。

如果在 PHP 中不起作用continue的 C++ 中有意义,请使用它。switch

于 2012-09-10T10:36:57.923 回答
2

正如PHP 手册中所警告的那样:

“请注意,在 PHP 中,switch 语句被认为是用于 continue 的循环结构。”

所以使用 continue 会跳出 switch 语句,而不是 for 循环。跨语言假设相似语法的危险。

于 2012-09-10T10:35:26.340 回答
1

重要的是要注意,continue当语句嵌套在循环中时,它break的行为并不相同。switch如果您正在使用switch语句来评估某些内容,并且如果满足条件,并且想要移动到循环中的下一个项目,则应该使用continue 2. 在这种情况下使用break 2将跳出整个for循环,这可能不是所需的操作。

于 2014-08-21T22:26:41.477 回答
0

在 C 和 C++ 中,该switch语句只是if/else if和 labels/的一种奇特组合goto,所以使用continueinsideswitch是可以的。但正如您注意到的那样,它并没有按照您在其他类似于C 或 C++ 的语言中的预期工作。那是因为它们仅在语法方面相似,对于语义规则,它们是非常不同的野兽。因此,即使语言看起来相似,在一种语言中工作的东西也绝对不会在另一种语言中工作。

于 2012-09-10T10:37:50.220 回答
0

switch / case在嵌入循环的 C++ 构造中使用 continue是完全可以的。你不应该仅仅因为在其他编程语言中出现不当行为而限制你在 C++ 中的风格。

于 2012-09-10T10:35:29.510 回答