使用if
和elseif
,可以轻松执行下面的比较,但出于学习目的,我正在分析是否可以使用switch
来实现相同的功能。< / p>
如果$x
收到正值或负值,我会得到正确的输出,但如果$x
收到0
(零),我会得到输出'Lower',但右边输出应该是'等于'。
以下是代码:
$x = 0;
switch($x)
{
case ($x < 0):
echo 'Lower';
break;
case ($x == 0):
echo 'Equal';
break;
case ($x > 0):
echo 'Bigger';
break;
default:
echo 'Not found';
}
是否可以使用带表达式的switch语句作为案例?
答案 0 :(得分:4)
switch($x)
将其替换为switch(true)
答案 1 :(得分:1)
您实际上不再匹配数字,而是匹配布尔结果。
任何正数或负数都会转换为布尔true
且只有0
转换为false
,所以基本上对于正数或负数,您要将true
与($x < 0)
进行比较1}}或($x > 0)
,它会给出您期望的结果。
然而,0
投射到false
和(0 == 0)
是true
所以你永远不会有匹配。由于0 < 0
也是false
,因此您在交换机中的第一个语句是匹配的。
答案 2 :(得分:0)
您正在比较$ x是否等于测试结果,当$x = 0
时,$ x的布尔值为false
。如果它与0不同,则为true
。这就是为什么你总是会回到第一个返回false
的测试。
请改为尝试:
$x = 0;
switch($x)
{
case 0:
echo 'Equal';
break;
case ($x < 0):
echo 'Lower';
break;
case ($x > 0):
echo 'Bigger';
break;
default:
echo 'Not found';
}
我还在评论中读到您想知道是否可以在case
的每个switch
中使用句子。是的,有可能:
$x = 0;
switch($x)
{
case ($x < 0):
echo 'Lower';
break;
case ($x > 0):
echo 'Bigger';
break;
case ($x <> 0):
echo 'Equal';
break;
default:
echo 'Not found';
}
当($x <> 0)
时, $x = 0
将返回false,并且它将回显“Equal”