【问题标题】: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
    }
}

【问题讨论】:

    标签: php conditional if-statement


    【解决方案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】:

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

            【讨论】:

            • 现在我感觉饿了 :) 但我不吃披萨
            猜你喜欢
            • 1970-01-01
            • 2019-09-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-02-24
            • 2017-01-13
            相关资源
            最近更新 更多