Php 为什么switch语句即使在没有找到匹配项的情况下也执行case块?

Php 为什么switch语句即使在没有找到匹配项的情况下也执行case块?,php,javascript,c,switch-statement,case,Php,Javascript,C,Switch Statement,Case,我知道,如果在每个case表达式匹配之后不使用break,大多数编程语言都会继续执行每个语句。但我不明白为什么大多数语言在第二个和第三个case语句上执行case块作为成功匹配 我想澄清一下: 我知道switch语句的行为,但我不理解这样一种逻辑:即使没有找到匹配项,将case块/语句作为成功匹配项执行也是有意义的 更新:我刚刚更新了这个问题,以反映大多数编程语言,而不仅仅是PHP。来源: switch语句逐行执行(实际上是逐语句执行)。开始时,不执行任何代码。只有当发现case语句的值与swi

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

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

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

来源:

switch语句逐行执行(实际上是逐语句执行)。开始时,不执行任何代码。只有当发现case语句的值与switch表达式的值匹配时,PHP才会开始执行这些语句。PHP将继续执行这些语句,直到开关块结束,或者第一次看到break语句为止。如果不在案例语句列表的末尾编写break语句,PHP将继续执行以下案例的语句

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,PHP会继续检查switch语句情况

好像你不明白。您错过了以使用
中断
关键字:

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;
}
请注意,
case
语句类似于代码中的入口点。案例条件匹配后,代码将在所有案例中运行,直到达到
中断


到您的更新:注意到,对于大多数编程语言,这种行为与PHP相同,包括:C、C++、java、JavaScript、ActionScript、Pascal、……/P>< P>。 然而,最初采用这种方式的原因是,我怀疑它有助于减少代码重复

如果您有If-like:

switch(1){
    case 1: echo 1; break; 
    case 2: echo 2; break;
    case 3: echo 3; break; 
}
如果开关从未按要求执行,则您需要4个具有相同逻辑的“汤”和“炸薯条”的箱子,否则您可以使开关更漂亮:

if($item == 'SOUP' || $item == 'FRIES'){
    eat($item);
}elseif($item == 'JUICE'){
    drink($item);
}else{
    use($item);
}
为什么switch语句即使在匹配时也执行case块 找不到

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

switch($item){
    case 'SOUP':
    case 'FRIES':
        eat($item);
        break;
    case 'JUICE':
        drink($item);
        break;
    default:
        use($item);
        break;
}
因此,如果计数为3,则得到输出:

switch ( count ) {
      default : puts ( " ++++.....+++ " ) ;
      case 4: puts ( " ++++ " ) ;
      case 3: puts ( " +++ " ) ;
      case 2: puts ( " ++ " ) ;
      case 1: puts ( " + " ) ;
      case 0:;
      }
如果为2,则得到输出

+++
++
+
如果为10,则得到:

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


如果可以的话,你可以用别的工具来做这个,但是需要更多的打字

正确地阅读他们的问题。@jimjimmy1995
我知道,如果在每个案例之后不使用break,PHP会继续检查switch语句案例
他真的知道吗?你怎么能否决这个答案@jimjimmy1995好的,那么请原谅我。我真的不知道为什么|对不起,我只是觉得你的问题没有完全回答他们的问题。但我认为这不值得投反对票。@hek2mgl C#并不遵循这种行为。一个代码块可以有多个案例,但代码块不能失效。请注意,switch是一个可以以多种方式使用的语句。这不仅仅是许多其他if的替代品,但这并不是失败的理由。这是一个多案例匹配的好例子,但是可能有更好的方法来显示应该运行多个匹配的代码块。
++++.....+++ 
++++ 
+++ 
++ 
+