1

我在一个紧密循环中有一个 switch 语句,如下所示:

switch(true) {
    case /*expensive comparison */:
    case /*another expensive comparison */:
    case /*different expensive comparison */:
        return true;
}
return false;

我想看看是否有任何昂贵的比较是真的,但只有一个。我知道还有其他方法可以做到这一点,但这个看起来很干净。真正的问题是:如果expensive comparison计算结果为真,它是否也运行another expensive comparison,或者只是跳转到返回?

编辑: 我意识到这可以通过一个简单的 or 语句来完成,但现在我想知道理论上的缘故。

return /*expensive comparison */
         || /*another expensive comparison */
         || /*different expensive comparison */;
4

4 回答 4

2

是的,

他们一直跑,直到休息。匹配以下的案例都会运行,无论它们是否匹配

<?php
$i =0;
switch ($i) {
    case 0:
        echo "i equals 0";
    case 1:
        echo "i equals 1";
    case 2:
        echo "i equals 2";
}
?>

例如,将显示所有 3 个回声

Switch 语句旨在将 1 个值与多个条件进行比较。因此,一旦匹配,它就会被优化,不再寻找。

于 2013-10-01T22:22:01.283 回答
1

如果没有使用 break,PHP 将执行所有其他后续案例的语句,与案例是否匹配无关:

switch(1)
{
    case 1:
            echo 1;
    case 2:
            echo 2;
    case 3:
            echo 3;

    return 'done';
}

输出:123

"...PHP 继续执行语句直到 switch 块结束,或者它第一次看到一个 break 语句。如果你没有在 case 语句列表的末尾写一个 break 语句,PHP 将继续执行以下案例的语句。”

http://php.net/manual/en/control-structures.switch.php

于 2013-10-01T22:23:23.077 回答
1

您的带有所示开关的代码(其中没有任何中断)将评估所有这些。据我所知,|| 仅当前面的评估为假时,语法才会进行比较。

另一方面,采用 case 结构并使其行为与 || 相同并不需要太多。语法,并使代码更易于阅读。

无论哪种方式,只需简单的测试即可轻松获得此问题的答案。只需回显或错误记录每次比较的内容。在这样的网站上提问之前,最好自己尝试解决问题。

看看你尝试了什么?为什么。

于 2013-10-02T00:37:29.370 回答
0

我终于有机会对此进行一些测试,看起来它(至少 5.4)一旦匹配就停止评估案例。以下是我验证的方式:

<?php
function evaluate($id)
{
    echo $id, "\n";
    return true;
}

switch (true) {
    case evaluate(1):
    case evaluate(2):
    case evaluate(3):
    echo "Evaluated\n";
}

这是输出:

 >1
 >Evaluated
于 2013-10-03T13:09:01.863 回答