如果在switch语句中有一个匹配的case,那么默认情况会被评估吗?
例如:
switch ($x) {
case ($x > 5): print "foo";
case ($x%2 == 0): print "bar";
default: print "nope";
}
当x等于50时,您将看到
foo
和bar
,或者foo
、bar
和nope
?如果在switch语句中有一个匹配的case,那么默认情况会被评估吗?
例如:
switch ($x) {
case ($x > 5): print "foo";
case ($x%2 == 0): print "bar";
default: print "nope";
}
foo
和bar
,或者foo
、bar
和nope
?是的,如果没有"break",那么所有与第一个匹配的case
相对应的操作都将被执行。控制流将“穿过”所有后续的case
,并执行每个后续case
下的所有操作,直到遇到break;
语句或到达switch
语句的结尾。
在您的示例中,如果$x的值为50,则实际上会看到"nope"
。
请注意,switch
实际上执行的是一个简单的等式测试,即在switch
关键字后面的表达式和在case
关键字后面的每个表达式之间进行比较。
您的示例很不寻常,因为只有当$x的值为0时才会显示"foo"
。(实际上,当$x的值为0时,您将看到的是"foo bar nope"。)
在case
关键字后面的表达式被评估,这在您的示例中返回0(如果条件测试为false)或1(如果条件测试为true)。而正是这个值(0或1)与$x
进行比较。
如果在switch语句中有一个匹配的case,那么默认的case会被执行吗?
大多数情况下不会执行,默认的case通常会有break
语句。但是在你的情况下,它也会执行default
。
此外,请尽量避免编写单行代码(以提高可读性):
$x = 10;
switch (true) {
case ($x > 5):
print "foo";
case ($x%2 == 0):
print "bar";
default:
print "nope";
}
将打印出foobarnope
。因此回答你的问题:是的:-)
foobarnope
。只要任何一个情况为真,所有后续情况(包括默认情况)直到遇到 break(或 switch 结束)都将运行。http://codepad.viper-7.com/sjHYeZ - Jonathan Kuhncase ($x > 5):
简单来说就是
case true:
或者
case false:
根据 $x
的值进行判断,因为 ($x > 5)
是一个评估,而不是一个值。开关比较参数的值,以查看它是否等同于任何一个case
。
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";
}
但是,如果您按照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
switch
语句的解释。switch
语句的行为与if
语句完全相同。您可以比较值以获取true
或false
。 switch
只是一种方便的发明,使人们不必键入100个if / else组合并将代码嵌套到无法理解的地步。 - N.B.$x==($x>5)
中,会对$x进行隐式转换为布尔值,只要$x!=0就会评估为true。如果$x=0
,那么该语句实际上将返回true,因为$x将为false,$x>5也为false,所以你得到了false==false
。如果$x=1到5,则该语句返回false,因为任何非0数字都会转换为布尔值true。因此该语句变成了true==false
。任何大于5的数字该语句都将返回true,即true == true
。 - Jonathan Kuhn如果您自己尝试一下会更容易理解。
不过,无论如何,在一个case语句中不使用break,则所有后续case语句都将被执行(包括default语句)。
case ($x > 5)
的计算结果为case 1:
或者case true:
。 - Mattbreak
,你的代码将尝试匹配所有条件。有了break
,它会在第一个匹配时停止。 - N.B.