“或”的运算符优先级和赋值

Posted

技术标签:

【中文标题】“或”的运算符优先级和赋值【英文标题】:Operators precedence of "or" and assignment 【发布时间】:2013-03-27 23:31:15 【问题描述】:

今天发现了一些有趣的代码sn-p。简化后如下所示:

$var = null;

$var or $var = '123';

$var or $var = '312';

var_dump($var);

问题是,据我所知,precedence of assignment is higher that OR,所以,我认为,var_dump 应该输出 312(第一个 - 分配,第二个 - 逻辑比较)。但结果不同,我得到123(首先 - 检查$var 是否转换为true,其次 - 如果不是,分配值)。

问题是它是如何工作的?

为什么or|| 的行为相同?

【问题讨论】:

【参考方案1】:

您可以在Logical Operators 中查看有关此行为的示例

你也可以阅读关于Short-circuit evaluation的文章

短路表达式x Sand y(用Sand表示短路变体)等价于条件表达式if x then y else false;,表达式x Sor y等价于if x then true else y

php 中。

return x() and y();

等于

if (x())
  return (bool)y();
else
  return false;

return x() or y();

等于

if (x())
  return true;
else
  return (bool)y();

所以,交易不只是优先。

【讨论】:

有道理!谢谢!所以,原因是Short-circuit operators are, in effect, control structures rather than simple arithmetic operators【参考方案2】:

同理

$var = null;

if(!$var)$var = '123';
if(!$var)$var = '321';

var_dump($var);

【讨论】:

我知道这些是一样的。我想知道它是如何工作的 只有当or之前的语句是empty/false/null/etc...时,它才会在or(在你的情况下是$var = '123';)之后执行字符串

以上是关于“或”的运算符优先级和赋值的主要内容,如果未能解决你的问题,请参考以下文章

c++各类运算优先级

三元条件和赋值运算符优先级

C语言基础:运算符(算术 / 关系 / 逻辑 / 位 / 赋值 / 杂项运算符)运算符的优先级

自增运算符和赋值运算符的优先级及运算问题

c语言中规定 赋值运算符的左边必须是啥?

JavaScript:赋值运算符以及运算符优先级