是否可以使用带表达式的switch语句作为案例?

时间:2012-07-09 00:44:08

标签: php switch-statement

使用ifelseif,可以轻松执行下面的比较,但出于学习目的,我正在分析是否可以使用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语句作为案例?

3 个答案:

答案 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”