我在一个紧循环中有一个开关语句,如下所示:
switch(true) {
case /*expensive comparison */:
case /*another expensive comparison */:
case /*different expensive comparison */:
return true;
}
return false;我想看看是否有任何昂贵的比较是正确的,但只有一个。我知道还有其他方法可以做到这一点,但是这个看起来很好,很干净。真正的问题是:如果expensive comparison计算为true,那么它也运行another expensive comparison,还是跳到返回?
编辑:--我意识到这可以用简单的语句来完成,但是现在为了理论的考虑,我想知道。
return /*expensive comparison */
|| /*another expensive comparison */
|| /*different expensive comparison */;发布于 2013-10-03 13:09:01
我终于有机会对此进行一些测试,看起来(至少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-01 22:22:01
是,
他们一直跑到休息的时候。匹配的情况下的所有情况都运行,不管它们是否匹配。
<?php
$i =0;
switch ($i) {
case 0:
echo "i equals 0";
case 1:
echo "i equals 1";
case 2:
echo "i equals 2";
}
?>会显示所有3个回波,例如
开关语句的设计是为了将1值与许多条件进行比较。所以没有,一旦它有了匹配,它将被优化不再寻找更多。
发布于 2013-10-01 22:23:23
如果不使用中断,PHP将执行所有其他后续案例中的语句,这与案例是否匹配无关:
switch(1)
{
case 1:
echo 1;
case 2:
echo 2;
case 3:
echo 3;
return 'done';
}产出: 123
"...PHP继续执行语句,直到开关块结束,或者它第一次看到中断语句。如果您不在case语句列表的末尾写入中断语句,PHP将继续执行以下情况的语句。“
https://stackoverflow.com/questions/19126977
复制相似问题