【问题标题】:Precedence operator 'OR' and '=' in PHPPHP中的优先运算符'OR'和'='
【发布时间】:2014-03-03 00:50:53
【问题描述】:
$a = 1;
$a OR $a = 'somthing'
echo $a; //1

为什么?如果= 有很多优先级然后'OR' 那为什么OR 会先执行?

【问题讨论】:

  • 你知道形式语法吗?如果您了解形式语法,请阅读my answer here 我解释了优先级对编写语法规则的有用性。语言编写者根据哪个语句应该解析如何决定优先级来决定优先级。
  • 我在回答中又添加了几句话,请检查。

标签: php assignment-operator operator-precedence


【解决方案1】:

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

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

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

【讨论】:

  • 还要记住docs.php.net/language.operators.precedence 说:Operator precedence and associativity only determine how expressions are grouped, they do not specify an order of evaluation.
  • 那么,为什么 5+1*3 = 8 ?我认为,* - 优先于 +。这是正确的。就我而言,我认为:$a = 'somthing' //先做(优先),然后是 OR。
  • 我不同意你没有解释为什么 OR 的优先级高于 =
  • $a OR $a = 'somthing',这里的意思是if(!$a) { $a = 'somthing' }
  • @AlirezaFallah 您添加的信息是正确的并且您理解正确,但是我的意思是它并没有回答“为什么 OR 的优先级高于 =”。这是因为程序员通常喜欢写像$a OR $a = 'somthing' 这样的表达式,它应该被解析为$a OR ($a = 'somthing'),并且为了强加这个常量,语言作者决定保持= 的优先级高于OR。
【解决方案2】:

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

$a OR $a = 'somthing'

将被解析为:

($a OR $a) = 'somthing'

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

因为or 运算符的优先级很低,因此表达式$a OR $a = 'somthing' 解析为$a OR ($a = 'somthing') 并且根据短路,第一个操作数$a 被评估为true,第二个操作数表达式未评估和@ 987654329@ 仍然是 1

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

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

【讨论】:

  • @user3271784 欢迎您。我刚刚在 Alireza Fallah 的回答中添加了一条评论,也读到了。如果您知道正式语法,请阅读链接答案。
  • @AlirezaFallah 我添加了几行希望你能找到更好的。
【解决方案3】:

因为1 是真实的。

你在说$a OR $a = 'somthing';

a 为真将其设置为“somthing”

。 嗯,a 是真的,所以它不会被设置,而下面的代码会这样做。

$a = false;
$a OR $a = 'somthing';
echo $a; //"something"

【讨论】:

    猜你喜欢
    • 2023-01-31
    • 2017-12-24
    • 2012-08-10
    • 2018-04-02
    • 2019-01-17
    • 2019-06-10
    • 2011-10-19
    • 1970-01-01
    • 2011-06-21
    相关资源
    最近更新 更多