我试图了解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
,这意味着它正在检查$foo
是否分配给之前的任何内容,为其分配 5。
$foo or $foo = 5;
谁能解释为什么会这样?
基础知识:
-
赋值表达式会产生分配的值。
那是什么意思?
$foo = 'bar'
是一个表达式,其中赋值运算符=
赋值。表达式始终返回值本身。就像表达式1 + 2
产生值3
一样,表达式$foo = 'bar'
产生值'bar'
。这就是为什么这有效:$foo = $bar = 'baz'; // which is: $foo = ($bar = 'baz');
-
布尔运算是短路运算。如果不需要,则并不总是对双方进行评估。
true || false
总体上总是true
的,因为左操作数是true
的,所以整个表达式必须true
。 这里甚至没有对false
进行评估。 -
运算符优先级指示表达式的各个部分分组到子表达式中的顺序。较高优先级运算符与其操作数分组在较低优先级运算符之前。
因此:
$e = false || true;
正在评估false || true
,这将产生值 true
,该值被分配给 $e
。||
运算符的优先级高于=
,因此false || true
被分组到一个表达式中(而不是($e = false) || true
(。
$f = false or true;
这里现在or
的优先级低于=
,这意味着赋值操作在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
具有更高的优先级,并被视为一个表达式。由于它出现在 or
运算符的右侧,因此仅在必要时计算表达式。这取决于最初是什么$foo
。如果$foo
是true
,则根本不会评估右侧,因为true or ($foo = 5)
必须整体true
。如果$foo
最初有一个假值,则计算右侧并将5
分配给$foo
,这会导致5
,这是真的,这意味着整体表达式是true
的,没有人关心。
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
根据 php.net 关于逻辑运算符的网页:
这:
$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))
我们都知道循环只在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(因为这是真实的陈述(。
希望大家能理解。
$foo or $foo = 5;
Suppose let say $foo=true or $foo=5;
在这里它不会在运算符表达式之后进行评估,因此输出将为 $foo=1 现在表达式是
$foo=false or $foo=5;
在这里,它将在或 as = 更高的优先级之后进行评估,因此$foo
它将评估其中的哪个$foo=5
因此输出将被5
但是当我们评估$foo=false or true
所以这里它会考虑 = 更高的优先级,所以输出将是$foo=false
但整个表达式将评估为 true,因为false or true
变得false
<?php
$foo = false;
$foo or ($foo = '5');
echo $foo;
?>
检查这一点,您可以为$foo
分配值"5"。
比较比or
=
具有高优先级。.这就是事实。 :)