在switch语句中,我是否应该使用continue语句?

50

我注意到在 switch 语句中确实可以使用 continue 关键字,在 PHP 中它却没有达到我的预期效果。

如果在 PHP 中出现了问题,那么有多少其他的语言也会出现同样的问题呢?如果我经常切换语言,那么代码不按照我的预期行事就会成为一个问题。

那么我应该避免在 switch 语句中使用 continue 关键字吗?

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
*/

循环结束?我不会把switch称为循环语句,从我的角度来看它是一个扩展的if-else语句 - 那么你在if-else中使用continue吗? - Zathrus Writer
我认为询问关于编程结构的通用建议并不是一个好主意,因为这些结构在不同的语言中被称为相同的名称。应该为每种语言寻求建议,毕竟它们都有不同的最佳实践。因此,我的建议是在那些适用的语言中使用 continue,并且在通常情况下被认为是一件好事的地方使用它。 - PlasmaHH
1
@ZathrusWriter 这个问题是关于“for循环结束”,而不是“循环结束”。问题中的continue旨在跳转到for循环的结尾。 - user743382
@hvd 哈哈,我需要更好的眼镜...抱歉 :D - Zathrus Writer
@PlasmaHH,有时我会将C++代码转换为PHP,或者相反...这就是为令人容易出错的原因。 我不知道PHP中是否还有其他行为不同的功能。 - Rookie
3
@Rookie:我想说的是,PHP和C ++之间存在足够多的差异,以至于你应该在每一行代码上都要小心谨慎,而不仅仅是试图“直观地翻译”源代码。在我看来,这只是在翻译时会遇到的许多陷阱之一;在任何语言之间都是如此,不仅限于PHP和C ++。 - PlasmaHH
7个回答

85

尝试使用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;
    }

//这将打印: 睡觉... 睡觉... 睡觉... 你好世界!


2
我刚遇到了一个使用情况,其中我有一个带有 switch 的 for 循环。非常有用!在许多场景中,PHP 的 break n / continue n 语法为我节省了很多精力。如果你对这个答案再详细解释一下,我认为它应该成为被采纳的答案。 - newms87
1
这是一个我从未了解过的非常令人兴奋的可选参数。我感觉我刚刚重新开始学习PHP。 - Thomas
2
我已经使用PHP七年了,但仍然从PHP的基础知识中学到新东西!难以置信!非常感谢! - Rafael Moni
谢谢您,先生。这正是我在寻找的。 - Chad Fisher

58

PHP 7.3 或更高版本:

使用 continue 语句来终止一个 switch 语句已被弃用,并会触发警告。

要退出一个 switch 语句,请使用 break 语句。

要继续执行包围当前 switch 语句的循环的下一轮迭代,请使用 continue 2 语句。

PHP 7.2 或更早版本:

continuebreak 语句在 PHP 的 switch 语句中可以互换使用。


4
在C++中,在do { ... } while (0)循环中,continuebreak的作用相同,但在其他情况下它们是不同的。在PHP中,在switch语句中,continuebreak的作用相同,但在其他情况下它们是不同的。 - user743382
1
正如@TheForestAndTheTrees在手册中指出的那样,switch被认为是一种循环结构,而continue是为循环结构设计的。不幸的是,我从未见过switch 'loop',你呢? - Aesthete
@hvd,等一下...在C++中,do-while循环中的continue命令是否像break命令一样?现在我有点困惑了...我也不理解PHP的switch语句中“循环结构”的概念。如果你在PHP中使用switch,它是否只是简单地遍历某种类型的数组,而不是像在C++中那样快速找到正确的路径?! - Rookie
4
“因为这就是 PHP 的特点:就像方轮一样。” - Ignacio Vazquez-Abrams - jrok
@Rookie 在 C++ 的 do { ... } while (0) 循环中,不仅仅是任何 do ... while 循环。跳到循环的末尾和跳到循环后面是一样的,因为条件总是为假。我只是想指出这显然不是在 C++ 中复制命令,但出于同样的原因,在 PHP 中也不会复制命令。 - user743382
显示剩余3条评论

8

PHP continue 语句的文档说明已经明确表明:

注意:在 PHP 中,为了实现continue的目的,switch 语句被认为是循环结构。

你需要知道的是,不同的编程语言可能会对相同的关键字赋予微妙的不同含义,并且不能假设 PHP 的 continue 表现与 C++ 的 continue 相同。

如果在 PHP 的 switch 中使用 continue 能够达到预期的效果,而在 C++ 的 switch 中则不行,则应该使用它。

如果在 C++ 的 switch 中使用 continue 能够达到预期的效果,而在 PHP 的 switch 中则不行,则应该使用它。


如果一个开关在循环内部,continue 2 将继续执行外部循环的下一次迭代。 - John

2
PHP手册所警告的那样:
“请注意,在PHP中,为了continue语句的目的,switch语句被视为循环结构。”
因此,使用continue将会跳出switch语句,而不是for循环。假设相似的语法可以在不同的语言中通用是非常危险的。

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

0

在循环中嵌套使用 C++ switch / case 结构并在其中使用 continue 是完全可以的。你不应该因为其他编程语言中出现的错误行为而限制自己在 C++ 中的风格。


continue 只能出现在 C++ 的迭代语句中。OP 中的示例之所以合法,是因为有一个 for 循环包含了 switch 语句。 - jrok
@jrok澄清了一下,现在好了吗? - πάντα ῥεῖ

0
在C和C++中,switch语句只是if/else if和标签/goto的花哨组合,因此在switch内部使用continue是可以的。但正如您所注意到的,在其他与C或C++类似的语言中,它并不像您期望的那样工作。这是因为它们只在语法上相似,在语义规则方面它们是非常不同的东西。因此,即使这些语言看起来相似,一个语言中可行的事情在另一个语言中也很可能行不通。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接