web-dev-qa-db-ja.com

&&の後の条件は常に評価されますか

以下の2つの条件をテストするこのifステートメントがあります。 2番目は関数goodToGo()なので、最初の条件がすでに真でない限り、それを呼び出したい

_$value = 2239;

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

function goodToGo($value){
   $ret = //some processing of the value
   return $ret; 
}
_

私の質問は、条件_$value < 2000_ _&&_ goodToGo($value)の2つについてです。それらは両方とも評価されますか、それとも最初のものが真である場合にのみ2番目のものが評価されますか?

つまり、次の2つのブロックは同じですか?

_if($value < 2000 && goodToGo($value)) {
   //stuff to do
}

if($value < 2000) {
    if (goodToGo($value)){
       //stuff to do
    }
}
_
44
brett

いいえ-2番目の条件が常に実行されるとは限りません(これにより、例が同等になります)。

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());
83
sblom

はい。 2つのブロックは同じです。 PHPは、ほとんどの(すべてではない)言語と同様に、&&および||短絡評価を使用します。

6
Stephen Canon

2つのブロックは同じです。

PHP論理演算子は「遅延」であり、必要な場合にのみ評価されます。次のコードは「Hello、world!」を出力します。

<?php
$a = 10;
isset($a) || die ("variable \$a does not exist.");
print "Hello, world!"
?>

他の論理演算子には、&&、および、またはが含まれます。

<?php
perform_action() or die ('failed to perform the action');
?>

人気のあるイディオムです。

3
Ming-Tang

2番目の条件は、最初の条件が真である場合にのみチェックされるため、両方のステートメントは同等です。

2
Imran Naqvi

はい、指定した2つのコードブロックは同等です。 PHPは短絡しているため、||および&&を使用すると、最初のステートメントの後のステートメントは必要な場合にのみ評価されます。

1
Justin Ardini

常にあなたの技術的な言語をあなた自身の言語と相互に関連付けてください。ここでも同様に、口頭での会話であなたに言うと、次のようになります。それなら私だけがピザを食べています」?だからここであなたは後のフレーズが私が空腹でなくなるまで私はピザを食べていないと言っているのを見ることができます、そして前者は私が空腹でピザを食べていると言います。 :-)

0
OM The Eternity