&& 之后的条件是不是总是被评估
Posted
技术标签:
【中文标题】&& 之后的条件是不是总是被评估【英文标题】:does the condition after && always get evaluated&& 之后的条件是否总是被评估 【发布时间】:2011-02-01 21:25:34 【问题描述】:我有这个if
语句来测试以下两个条件。第二个是函数goodToGo()
,所以我想调用它,除非第一个条件已经为真
$value = 2239;
if ($value < 2000 && goodToGo($value))
//do stuff
function goodToGo($value)
$ret = //some processing of the value
return $ret;
我的问题是关于 2 if 条件 $value < 2000
&&
goodToGo($value)
。它们都得到评估还是只有在第一个为真时才评估第二个?
换句话说,以下 2 个块是否相同?
if($value < 2000 && goodToGo($value))
//stuff to do
if($value < 2000)
if (goodToGo($value))
//stuff to do
【问题讨论】:
【参考方案1】:不 - 第二个条件不会总是被执行(这使您的示例等效)。
php 的 &&
、||
、and
和 or
运算符被实现为“短路”运算符。一旦发现一个强制结果为整体条件的条件,后续条件的评估就会停止。
来自http://www.php.net/manual/en/language.operators.logical.php
// --------------------
// foo() will never get called as those operators are short-circuit
$a = (false && foo());
$b = (true || foo());
$c = (false and foo());
$d = (true or foo());
【讨论】:
我后来选择了这个答案,因为它提出了一个关于(true || foo())
的非常好的观点。本来以为第二个会评估,因为第一个是true
,但看起来情况并非如此。很高兴知道。
@brett,是的——关键是对于 OR,当你第一次找到 TRUE 时,你知道它会是 TRUE——没有多少 FALSE 会改变这一点。对于 AND,当你第一次找到 FALSE 时,你就知道它会是 FALSE——没有多少个 TRUE 会改变这一点。【参考方案2】:
是的。两个块是一样的。 PHP 与大多数(但不是全部)语言一样,对&&
和||
使用短路评估。
【讨论】:
【参考方案3】:这两个块是一样的。
PHP 逻辑运算符是“惰性的”,它们仅在需要时才被计算。 以下代码打印“Hello, world!”:
<?php
$a = 10;
isset($a) || die ("variable \$a does not exist.");
print "Hello, world!"
?>
其他逻辑运算符包括 &&、and、or。
<?php
perform_action() or die ('failed to perform the action');
?>
是一个流行的成语。
【讨论】:
【参考方案4】:只有当且仅当第一个条件为真时才会检查第二个条件,因此两个语句是等价的。
【讨论】:
【参考方案5】:是的,您提供的 2 个代码块是等效的。 PHP有短路,所以当你使用 ||和 &&,第一个之后的任何语句只在必要时被评估。
【讨论】:
【参考方案6】:始终将您的技术语言与您自己的语言相关联,同样在这里,如果我在口头对话中说您,就像:您在问=“如果我饿了 '&&' 我正在吃披萨”类似于“如果我饿了,只有我在吃披萨”? 所以在这里你可以看到后面的短语说,直到我不饿,我才不吃披萨,而前者说我很饿,我正在吃披萨。 :-)
【讨论】:
现在我感觉饿了 :) 但我不吃披萨以上是关于&& 之后的条件是不是总是被评估的主要内容,如果未能解决你的问题,请参考以下文章