【问题标题】:Why does the switch statement execute a case block even when a match is not found?为什么即使没有找到匹配项,switch 语句也会执行 case 块?
【发布时间】:2013-03-05 01:45:36
【问题描述】:
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?)
}

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

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

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

【问题讨论】:

  • 请注意,switch 是一个可以多种方式使用的语句。它不仅仅是许多其他 if 的替代品。

标签: php javascript c switch-statement case


【解决方案1】:

来自the manual

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;
}

【讨论】:

    【解决方案2】:

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

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

    如果你有一个如果喜欢:

    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;
    }
    

    【讨论】:

    • 不过,这并不是真正的失败论据。这是多案例匹配的一个很好的例子,但可能有更好的方法来显示应该运行多个匹配的代码块。
    【解决方案3】:

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

    看来你没听懂。您错过了使用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 ......

    【讨论】:

    • 正确阅读他们的问题。
    • @jimjimmy1995 I know that PHP continues to check the switch statement cases if you don't use break after each case 他真的知道吗?你怎么能拒绝这个答案!!?
    • @jimjimmy1995 好的,请原谅我。我真的不知道为什么。 :|
    • 对不起,我只是觉得您的问题没有完全回答他们的问题。不认为它应该投反对票。
    • @hek2mgl C# 不遵循这种行为。一个代码块可以有多个案例,但代码块不能落空。
    【解决方案4】:

    为什么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 来执行此操作,但输入会更多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-27
      • 2018-06-25
      • 2017-07-07
      • 2020-09-05
      • 1970-01-01
      • 2015-07-16
      相关资源
      最近更新 更多