48

orオペレーターの振る舞いを理解しようとしています。以下の例を参照してください。

$e = false || true;
var_dump($e);

出力は期待どおりです。bool(true);

$f = false or true;
var_dump($f);

出力は期待どおりです: bool(false). =は よりも優先順位が高いという意味でこれを理解したOrので、$fが に割り当てられfalseます。

しかし、以下のコードは、私が考えていたものとはまったく逆に機能します。$fooが割り当てられ5、それ自体と比較されると思いました。ただし、が設定されている$foo場合にのみ が割り当てられます。これは、が以前に割り当てられている$fooかどうかをチェックしていることを意味し、それに 5 を割り当てます。$foo

$foo or $foo = 5; 

なぜそうなのか、誰か説明できますか?

4

4 に答える 4

49

基礎:

  1. 割り当て式は、割り当てられた値になります。

    どういう意味ですか?$foo = 'bar'代入演算子=が値を代入する式です。式は常に値そのものを返します。式の結果が値になるように、式の結果1 + 2は値になります。これが機能する理由です:3$foo = 'bar''bar'

    $foo = $bar = 'baz'; // which is: $foo = ($bar = 'baz');
    
  2. ブール演算は短絡演算です。必要がない場合、両側が常に評価されるわけではありません。左側のオペランドがであるため、式全体true || falseは常にである必要があります。ここでも評価されていません。truetruetruefalse

  3. 演算子の優先順位は、式の一部がサブ式にグループ化される順序を決定します。優先順位の高い演算子は、優先順位の低い演算子の前にオペランドと共にグループ化されます。

したがって:

$e = false || true;

false || trueが評価され、 にtrue割り当てられる値 が得られ$eます。演算子は||よりも優先順位が高い=ため、false || true( ではなく) 式にグループ化され($e = false) || trueます。

$f = false or true;

Here はorよりも優先順位が低く=なりました。これは、代入演算が の前に 1 つの式にグループ化されることを意味しorます。したがって、最初に$f = false式が評価され、その結果はfalse(上記を参照) になります。したがって、次にfalse or true評価されて結果が になる単純な式が得られますがtrue、誰も気にしません。

評価は次のように機能します。

1. $f = false or true;
2. ($f = false) or true;  // precedence grouping
3. false or true;         // evaluation of left side ($f is now false)
4. true;                  // result

今:

$foo or $foo = 5; 

ここでも、$foo = 5優先順位が高く、1 つの式として扱われます。演算子の右側にあるためor、式は必要な場合にのみ評価されます。$fooそれは最初に何があるかによって異なります。が の場合、右側は全体的に評価される必要があるため、まったく評価され$fooません。ただし、最初は falsey 値を持っている場合、右側が評価され、 に割り当てられます。これは、 true-ish であり、式全体がであり、誰も気にしないことを意味します。truetrue or ($foo = 5)true$foo5$foo5true

1. $foo or $foo = 5;
2. $foo or ($foo = 5);   // precedence grouping
3. false or ($foo = 5);  // evaluation of left side
4. false or 5;           // evaluation of right side ($foo is now 5)
5. true;                 // result
于 2012-08-31T11:47:47.593 に答える
20

Logical Operators に関するphp.net Webページによると:

これ:

$e = false || true;

次のように動作します。

$e = (false || true) // If false is true, then $e = false. Otherwise true

これ:

$f = false or true;

次のように動作します。

($f = false) or true; // $f = false is true, as the assignment succeeded

これ:

$foo or $foo = 5; 

次のように動作します。

$foo or ($foo = 5) // foo = undefined or foo = 5, so foo = 5

最後の例では、undefined は基本的に false に似ているため、foo は 5 に等しくなります。

また、演算子の優先順位のリンクは次のとおりです: http://www.php.net/manual/en/language.operators.precedence.php

アップデート:

では、本題に入りましょう。フェッチされたクエリを使用するときは、次のように知っています。

while($row = @mysql_fetch_assoc($result))

while ループは でのみ実行されるtrueため、$row = @mysql_fetch_assoc($result)true を返します。

ダリックの質問と同じです。

$foo or $foo = 5;

基本的には:

$foo or ($foo = 5);

基本的には次のとおりです。

$foo = undefined or ($foo = 5); // $foo = 5 actually returns true

どちらも

$foo = undefined or true;

前に述べたように、undefined = false であるため、$foo = 5 (真のステートメントであるため) です。

誰もが理解できることを願っています。

于 2012-08-31T10:19:08.380 に答える
3
$foo or $foo = 5;

Suppose let say $foo=true or $foo=5;

ここでは、または演算子の式の後に評価されないため、出力は $foo=1 になります。式は次のようになります。

$foo=false or $foo=5;

ここでは、後にまたは次のように評価されます = 優先順位が高いため$foo、どちらが評価されるかが評価さ$foo=5れる5 ため$foo=false or true、出力は次のようになり$foo=falseます。false or truefalse

于 2012-08-31T10:24:49.273 に答える
2
<?php
$foo = false;
$foo or ($foo = '5');
echo $foo;
?>

これをチェックすると、 に値「5」を割り当てることができます$foo

優先度が高いよりも比較or =..それが事実です.... :)

于 2012-08-31T10:25:36.050 に答える