Php 假和(真和打印(';hi';)

Php 假和(真和打印(';hi';),php,logical-operators,short-circuiting,Php,Logical Operators,Short Circuiting,在PHP中,为什么false和(true&&print('hi')的计算结果为false,而不打印'hi'?我知道逻辑运算符在短路时求值(它们是惰性的),但是&和括号中的值大于和,因此应该首先求值(true&&print('hi')) 有什么线索吗?谢谢 这实际上是一个很好的测试示例,可以用来显示评估顺序 从左到右执行评估 因此,要在您的示例中添加一些内容 <?php // Evaluates Left to right // Prints HI as (true &&

在PHP中,为什么
false和(true&&print('hi')
的计算结果为
false
,而不打印
'hi'
?我知道逻辑运算符在短路时求值(它们是惰性的),但是
&
和括号中的值大于
,因此应该首先求值
(true&&print('hi'))


有什么线索吗?谢谢

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

从左到右执行评估

因此,要在您的示例中添加一些内容

<?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';
}

我可以在中看到以下内容:

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

因此,我测试了以下内容:

print('one')和(1+print('two'))
它会打印:

onetwo
因此PHP首先计算
的左操作数,即使
+
具有更高的优先级,甚至使用括号。有趣


谢谢大家。

@CBroe它不一样。他在考虑运算符优先级时问它不使用“true”。@tan是的。“在&&(或
,如此处所示)之后的条件是否总是得到评估”的问题得到了回答,但
为否,且某物
-该
某物
甚至没有得到任何必要的进一步检查。运算符优先级是指运算符对表达式结果的影响,不一定是单个子表达式的求值顺序。不确定为什么会出现这些假设性问题,如果我在一家公司工作时编写此代码,我将被开除,所以没有投票。@CBroe我读了一遍又一遍来理解和消化这一行“运算符优先级并不意味着运算符对表达式结果的影响,不一定是单个子表达式的求值顺序”,这是一个老生常谈的错误。感谢CBroe和里卡多·佩雷斯·洛夫pez@NigelRen因为人们想学习???