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

时间:2013-03-05 01:45:37

标签: php javascript c switch-statement case

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,大多数编程语言会继续执行每个语句。但我很困惑为什么大多数语言都会在第二和第三个案例陈述中成功匹配案例块。

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

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

4 个答案:

答案 0 :(得分:4)

来自the manual

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

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

答案 1 :(得分: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;
}

答案 2 :(得分:1)

  

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

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

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

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

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

答案 3 :(得分:0)

  

为什么即使匹配时switch语句也执行case块   找不到?

如果您不使用Red Team,它将执行所有切换,这有时会有所帮助。例如:

struct AllTeams: Codable {
    let Teams: [String : Team]

    struct Team: Codable {
        //let <property>: ???
    }

    struct ???: Codable {
        let motto: String
        let players: [Player]
    }

    struct Player: Codable {
        let name: String
        let skill: String
        let birthday: Int // will need to convert this
    }
}

因此,如果count为3,则输出:

break

如果为2,则输出为

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

如果10,您将得到:

+++
++
+

因此,有时候您希望您的开关在找到所需内容后执行其他情况。像上面的代码。

如果可以的话,可以用else来做,但是要打字得多。