【问题标题】:false and (true && print('hi')) [duplicate]false and (true && print('hi')) [重复]
【发布时间】:2018-04-02 08:39:39
【问题描述】:

在 PHP 中,为什么 false and (true && print('hi')) 的计算结果为 false 并且不打印 'hi'?我知道逻辑运算符在短路中求值(它们是惰性),但&& 和括号的upper precedenceand 多,所以应该首先求值(true && print('hi'))

有什么线索吗?谢谢!

【问题讨论】:

  • @CBroe 它不一样。他在考虑运算符优先级时询问它是否与“true”一起使用。
  • @tan 是的。问题“在&&(或and,如此处)之后的条件是否总是得到评估” 回答为否false and something - something 甚至没有得到任何进一步的关注必要的。运算符优先级确实意味着运算符对表达式的结果的影响,不一定是各个子表达式的评估顺序。
  • 不知道为什么会出现这些假设性问题,如果我在为一家公司工作时编写此代码,我预计会被踢出局,而不是在 SO 上投票。
  • @CBroe 我一遍又一遍地阅读以理解和消化这一行“运算符优先级确实意味着运算符对表达式结果的影响,不一定是各个子表达式的评估顺序”老学校的错误。感谢 CBroe 和 Ricardo Pérez López
  • @NigelRen 因为人们想学习???

标签: php logical-operators short-circuiting


【解决方案1】:

这实际上是一个很好的测试示例来显示评估顺序。

评估是从左到右进行的。

所以要为您的示例添加一些内容...

<?php

// Evaluates Left to right
// Prints HI as (true && print('Hi') evaluates as TRUE
// Then the && FALSE is tested and it fails
if((true && print('Hi')) && FALSE){
    echo 'Success';
} else {
    echo 'Failed';
}

// Evaluates Left to right
// FALSE is evaluated and Fails
// No further checking is performed
if(FALSE && (true && print('Hi'))){
    echo 'Success';
} else {
    echo 'Failed';
}

注意:我没有放入 AND 与 && 但你得到相同的结果。

【讨论】:

    【解决方案2】:

    我可以在http://php.net/manual/en/language.operators.precedence.php看到以下内容:

    运算符优先级和关联性仅决定表达式的分组方式,它们不指定求值顺序。 PHP 没有(在一般情况下)指定表达式的求值顺序,并且应该避免假定特定求值顺序的代码,因为行为可能会在 PHP 版本之间或取决于周围的代码而改变。

    所以,我测试了以下内容:

    print('one') and (1 + print('two'))
    

    然后打印出来:

    onetwo
    

    所以 PHP 首先评估 and 的左操作数,即使 + 具有更高的优先级,甚至使用括号。有趣!

    谢谢大家。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-08
      • 2020-12-15
      • 2019-02-08
      • 2017-04-30
      • 2021-10-19
      • 2023-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多