如果在之前有匹配的情况,是否会对switch语句的默认值进行评估?
例如:
switch ($x) {
case ($x > 5): print "foo";
case ($x%2 == 0): print "bar";
default: print "nope";
}
因此,对于x = 50,您会看到foo
和bar
,或foo
以及bar
和nope
?
答案 0 :(得分:6)
是的,如果没有“中断”,则将执行匹配的第一个case
之后的所有操作。控制流将“落后”所有后续case
,并执行每个后续case
下的所有操作,直到遇到break;
语句,或直到{{switch
结束达到了1}}声明。
在您的示例中,如果$ x的值为50,您实际上会看到"nope"
。
请注意,switch
实际上是在switch
关键字后面的表达式和case
关键字后面的每个表达式之间执行简单的相等性测试。
你的例子很不寻常,因为当$ x的值为0时,它只会显示"foo"
。实际上,当$ x的值为0时,你会看到的是“foo bar nope” ”。)
评估case
关键字后面的表达式,在您的示例中,示例返回0(如果条件测试为false)或1(如果条件测试为true)。它是switch
与$x
比较的值(0或1)。
答案 1 :(得分:5)
如果在之前有匹配的情况,是否会对switch语句的默认值进行评估?
在大多数case
中它不应该,因为你经常会有break
个。但是在你的情况下,它也会转到default
。
另外请尽量防止这些单行内容(为了便于阅读):
$x = 10;
switch (true) {
case ($x > 5):
print "foo";
case ($x%2 == 0):
print "bar";
default:
print "nope";
}
将打印foobarnope
。所以回答你的问题:是的: - )
答案 2 :(得分:2)
自己尝试一下会更容易。但无论如何,如果你不在案件中使用break,那么它后面的所有案例都将被执行(包括默认值)
答案 3 :(得分:1)
这不是交换机的工作原理。
switch语句类似于上面的一系列IF语句 同样的表达。在许多情况下,您可能想要比较相同的 变量(或表达式)具有许多不同的值,并执行a 不同的代码段取决于它等于的值。这是 正是switch语句的用途。
像
这样的评估case ($x > 5):
简单等同于
case true:
或
case false:
取决于$x
的值,因为($x > 5)
是 EVALUATION ,而不是 VALUE 。开关比较参数的值以查看它是否等于任何case
s。
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