0
switch(1){
    case 1: print 1; // prints 1 (as expected)
    case 2: print 2; // prints 2 (even though match is not equal?)
    case 3: print 3; // prints 3 (even though match is not equal?)
}

break我知道如果在每个 case 表达式匹配后不使用,大多数编程语言都会继续执行每个语句。但是我很困惑为什么大多数语言在第二个和第三个 case 语句上执行一个 case 块作为成功匹配。

澄清一下:我知道 switch 语句的行为,但我不明白即使没有找到匹配项,将 case 块/语句作为成功匹配执行也是有意义的逻辑。

更新:我刚刚更新了这个问题以反映大多数编程语言,而不仅仅是 PHP。

4

4 回答 4

4

手册

switch 语句逐行执行(实际上是逐语句执行)。一开始,没有代码被执行。只有当 case 语句的值与 switch 表达式的值匹配时,PHP 才会开始执行语句。PHP 继续执行语句,直到 switch 块结束,或者它第一次看到 break 语句。如果你不在一个 case 语句列表的末尾写一个 break 语句,PHP 将继续执行下一个 case 的语句。

switch(1){
    case 1: 
         echo 1; // echos 1 (as expected)
         break; // stop!!!
    case 2: 
         echo 2; // won't get here
         break;
    case 3: 
         echo 3; //or here
         break;
}
于 2013-03-05T01:47:22.233 回答
3

之所以这样,可能是因为 PHP 借鉴了 C 的语法。

然而,它最初采用这种方式的原因是它有助于减少我怀疑的代码重复。

如果你有一个 if 喜欢:

if($item == 'SOUP' || $item == 'FRIES'){
    eat($item);
}elseif($item == 'JUICE'){
    drink($item);
}else{
    use($item);
}

如果开关从未通过,您将需要 4 个具有相同逻辑的“SOUP”和“FRIES”案例,没有这个,您可以使开关更好:

switch($item){
    case 'SOUP':
    case 'FRIES':
        eat($item);
        break;
    case 'JUICE':
        drink($item);
        break;
    default:
        use($item);
        break;
}
于 2013-03-05T02:07:03.303 回答
2

我知道如果您在每个案例之后不使用 break,PHP 会继续检查 switch 语句案例

好像没看懂。您错过了使用break关键字:

switch(1){
    case 1: echo 1; break; 
    case 2: echo 2; break;
    case 3: echo 3; break; 
}

请注意,case语句就像代码中的入口点。在 case 条件匹配后,代码将运行所有 case 直到break达到。

对于您的更新:请注意,PHP 的这种行为与大多数编程语言的行为相同,包括:C、C++、Java、Javascript、ActionScript、Pascal ......

于 2013-03-05T01:47:25.850 回答
0

为什么即使没有找到匹配项,switch 语句也会执行 case 块?

如果您不使用break,它将执行所有开关,这有时会很有帮助。例如:

switch ( count ) {
      default : puts ( " ++++.....+++ " ) ;
      case 4: puts ( " ++++ " ) ;
      case 3: puts ( " +++ " ) ;
      case 2: puts ( " ++ " ) ;
      case 1: puts ( " + " ) ;
      case 0:;
      }

因此,如果 count 为 3,您将得到输出:

+++
++
+

如果为 2,则得到输出

++
+

如果是 10,你会得到:

++++.....+++ 
++++ 
+++ 
++ 
+ 

因此,有时您希望您的交换机在找到您想要的内容后执行其他情况。就像上面的代码一样。

您可以使用 else if 来执行此操作,但输入会更多。

于 2019-01-20T20:26:59.823 回答