8

如果之前有匹配的案例,是否会评估 switch 语句的默认值?

前任:

switch ($x) {
  case ($x > 5): print "foo";
  case ($x%2 == 0): print "bar";
  default: print "nope";
}

所以对于 x = 50,你会看到fooand bar, or fooand barand nope?

4

4 回答 4

9

是的,如果没有“break”,那么第一个case匹配之后的所有动作都将被执行。控制流将“遍历”所有后续case,并执行每个后续下的所有操作case,直到break;遇到语句,或者直到switch到达语句的末尾。

在您的示例中,如果 $x 的值为 50,您实际上会看到"nope".

请注意,这switch实际上是在关键字后面的表达式switch和关键字后面的每个表达式之间执行简单的相等测试case

您的示例很不寻常,因为它只会在 $x 的值为 0 时显示"foo"。(实际上,当 $x 的值为 0 时,您会看到“foo bar nope”。)

评估关键字后面的表达式case,在您的情况下,示例返回 0(如果条件测试为假)或 1(如果条件测试为真)。它是那个值(0 或 1)switch将与$x.

于 2012-08-10T18:55:59.180 回答
5

如果之前有匹配的案例,是否会评估 switch 语句的默认值?

在大多数cases 中它不应该,因为你经常会有breaks 在那里。但是,在您的情况下,它也会转到default.

另外请尽量防止做那些单行的东西(为了可读性):

$x = 10;

switch (true) {
  case ($x > 5):
      print "foo";

  case ($x%2 == 0):
      print "bar";

  default:
      print "nope";
}

将打印foobarnope。所以回答你的问题:是的:-)

于 2012-08-10T14:50:39.830 回答
2

自己尝试会更容易。

但是无论如何,如果你不在一个case中使用break,它后面的所有case都会被执行(包括默认的)。

于 2012-08-10T14:51:21.073 回答
2

这不是开关的工作方式。

根据手册

switch 语句类似于同一表达式上的一系列 IF 语句。在许多情况下,您可能希望将同一个变量(或表达式)与许多不同的值进行比较,并根据它等于哪个值来执行不同的代码。这正是 switch 语句的用途。

像这样的评价

case ($x > 5):

简单地等同于

case true:

或者

case false:

取决于$x因为的值($x > 5)EVALUATION,而不是VALUE。开关比较参数的值以查看它是否等于任何cases。

switch($x) {
    case ($x > 5): // $x == ($x > 5)
        echo "foo";
        break;
    case ($x <= 5): // $x == ($x <= 5)
        echo "bar"
        break;
    default:
        echo "default";
        break;
}

上面代码中的比较等价于

if ($x == ($x > 5)) {
    echo "foo";
} elseif ($x == ($x < 5)) {
    echo "bar";
} else {
    echo "five";
}

其中(当$x == 50)等价于

if ($x == true) {
    echo "foo";
} elseif ($x == false) {
    echo "bar";
} else {
    echo "five";
}

这相当于

if (true) { // $x == true is the same as saying "$x is truthy"
    echo "foo";
} elseif (false) {
    echo "bar";
} else {
    echo "five";
}

IF但是,您使用了您的 switch 语句,因为它打算使用(将参数与具体值进行比较):

switch ($x) {
    case 50:
        echo "foo ";
    case 30:
        echo "bar ";
    default:
        echo "foo-bar";
}

并且$x == 50,您的输出将是

foo bar foo-bar

由于break您的情况下没有。

如果您将break关键字添加到每个案例的末尾,您将只执行该特定案例的代码。

switch ($x) {
    case 50:
        echo "foo ";
        break;
    case 30:
        echo "bar ";
        break;
    default:
        echo "foo-bar";
        break;
}

输出:

foo 
于 2012-08-10T14:54:52.940 回答