PHP 中的优先运算符 'OR' 和 '='

Precedence operator 'OR' and '=' in PHP

提问人:user3271784 提问时间:2/6/2014 最后编辑:user2864740user3271784 更新时间:9/20/2015 访问量:110

问:

$a = 1;
$a OR $a = 'somthing'
echo $a; //1

为什么?如果优先级很高,那么“OR”,那么为什么先执行 OR 呢?=

php 赋值 符 运算符优先级

评论

0赞 Grijesh Chauhan 2/6/2014
你知道正式语法吗?如果你知道正式语法,那么请阅读我的答案,我在这里解释了优先级对编写语法规则有何用处。语言编写者根据哪个语句应该解析如何决定优先级来决定优先级。
0赞 Grijesh Chauhan 2/7/2014
我在回答中又加了几句话,请检查。

答:

1赞 gherkins 2/6/2014 #1

因为是真的。1

你说的是$a OR $a = 'somthing';

a 为 true 将其设置为“something”

. 好吧,a 是真的,所以它不会被设置,而下面的代码就可以了。

$a = false;
$a OR $a = 'somthing';
echo $a; //"something"
2赞 Alireza Fallah 2/6/2014 #2

当您在两个语句之间放置 OR 时,如果第一个语句返回 true,则永远不会执行第二个语句。

在这种情况下,第一个语句 ( ) 返回 true ( 因为 ),所以$a$a = 1

第二个 ( $ ) 不会被执行。a = 'somthing';

评论

1赞 VolkerK 2/6/2014
还要记住,docs.php.net/language.operators.precedence 说:Operator precedence and associativity only determine how expressions are grouped, they do not specify an order of evaluation.
1赞 user3271784 2/6/2014
那么,为什么 5+1*3 = 8 ?我认为,* - 比 + 优先。它的权利。就我而言,我认为:$a = 'something' //先做(向上优先),然后是 OR。
0赞 Grijesh Chauhan 2/6/2014
我不同意你的回答,没有解释为什么 OR 的优先级更高=
0赞 Alireza Fallah 2/6/2014
$a OR $a = 'somthing',这里 ,表示if(!$a) { $a = 'somthing' }
1赞 Grijesh Chauhan 2/6/2014
@AlirezaFallah您添加的信息是正确的并且您理解正确,但正如我的意思,它并没有回答“为什么 OR 的优先级高于 =”。这是因为程序员通常喜欢写这样的表达式,它应该是 pareses as 和 强加这个常数语言,编写者决定保持高于 OR 的优先级。$a OR $a = 'somthing'$a OR ($a = 'somthing')=
1赞 Grijesh Chauhan 2/6/2014 #3

因为如果 OR 具有更高的优先级,那么

$a OR $a = 'somthing'

将被解析为:

($a OR $a) = 'somthing'

这在技术上是错误的,因为你不能赋值给一个表达式(而程序员希望像这样编写表达式,所以它应该是一个有效的表达式)。

因为算子的优先级很低,因此表达式被简化为 并且根据短路第一操作数,即被计算为 和 第二操作数表达式未计算并保持不变。or$a OR $a = 'somthing'$a OR ($a = 'somthing')$atruea1

请记住,优先级规则派生语法规则,从而告诉如何解析表达式。但优先级是一个编译时属性,它告诉我们表达式的结构。计算是一种运行时行为,它告诉我们表达式的计算方式(因此表达式的计算方式无法完全由优先级确定)。PHP文档似乎也这么说:

运算符优先级
运算符优先级和关联性仅决定表达式如何 分组,它们不指定评估顺序。PHP 没有 (在一般情况下)指定表达式的顺序 已计算,并且假定特定计算顺序的代码应 避免,因为该行为可能会在 PHP 或 取决于周围的代码。

评论

0赞 Grijesh Chauhan 2/6/2014
@user3271784 欢迎您的到来。我刚刚在 Alireza Fallah 的回答中添加了一条评论,也读了。如果您知道正式语法,请阅读链接答案。
0赞 Grijesh Chauhan 2/6/2014
@AlirezaFallah我又加了几行,希望你能找到更好的。