&& 之后的条件是不是总是被评估

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 &lt; 2000 &amp;&amp; goodToGo($value)。它们都得到评估还是只有在第一个为真时才评估第二个?

换句话说,以下 2 个块是否相同?

if($value < 2000 && goodToGo($value)) 
   //stuff to do


if($value < 2000) 
    if (goodToGo($value))
       //stuff to do
    

【问题讨论】:

【参考方案1】:

不 - 第二个条件不会总是被执行(这使您的示例等效)。

php&amp;&amp;||andor 运算符被实现为“短路”运算符。一旦发现一个强制结果为整体条件的条件,后续条件的评估就会停止。

来自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 与大多数(但不是全部)语言一样,对&amp;&amp;|| 使用短路评估

【讨论】:

【参考方案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】:

始终将您的技术语言与您自己的语言相关联,同样在这里,如果我在口头对话中说您,就像:您在问=“如果我饿了 '&&' 我正在吃披萨”类似于“如果我饿了,只有我在吃披萨”? 所以在这里你可以看到后面的短语说,直到我不饿,我才不吃披萨,而前者说我很饿,我正在吃披萨。 :-)

【讨论】:

现在我感觉饿了 :) 但我不吃披萨

以上是关于&& 之后的条件是不是总是被评估的主要内容,如果未能解决你的问题,请参考以下文章

C# 是不是使用 await 对 if 语句执行短路评估?

JSF 页面中的 <c:choose><c:when> 不起作用,似乎总是评估为 false

&= 和 |= 是不是有定义的评估顺序?

是否保证不会对 if 语句进行不必要的评估? [复制]

声纳误报,“改变条件,使其并不总是评估为真。”

当 lhs 为假时,为啥在逻辑 AND 中评估条件(三元)运算符