关于逻辑运算符&&;在php中
这是密码关于逻辑运算符&&;在php中,php,Php,这是密码 $a = 2; $a && $a = 1; var_dump( $a ); // result 1 为什么$a是1 根据文档,逻辑运算符“&&”比赋值运算符具有更高的优先级,它应该被解释为($a&&$a)=1,那么应该有语法错误。按照它的编写方式,您所说的与此相同 $a = 2; if($a) $a = 1; 由于2是某种东西,它成功地将$a更改为1 那么它为什么要这样做呢?您有一条语句,$a=2;这里没有操作顺序,所以PHP处理它。操作顺序在第二条语句中生效。请
$a = 2;
$a && $a = 1;
var_dump( $a ); // result 1
为什么$a是1
根据文档,逻辑运算符“&&”比赋值运算符具有更高的优先级,它应该被解释为($a&&$a)=1,那么应该有语法错误。按照它的编写方式,您所说的与此相同
$a = 2;
if($a) $a = 1;
由于2
是某种东西,它成功地将$a
更改为1
那么它为什么要这样做呢?您有一条语句,$a=2
;这里没有操作顺序,所以PHP处理它。操作顺序在第二条语句中生效。请记住,$a
是某种东西(即truthy)。让我们稍微修改一下代码
$a = 0;
$a && $a = 1;
echo $a;
如您所见,
$a
现在是falsy。因此,顺序阻止脚本更改值,脚本以其编写方式输出0
,您的意思与此相同
$a = 2;
if($a) $a = 1;
由于2
是某种东西,它成功地将$a
更改为1
那么它为什么要这样做呢?您有一条语句,$a=2
;这里没有操作顺序,所以PHP处理它。操作顺序在第二条语句中生效。请记住,$a
是某种东西(即truthy)。让我们稍微修改一下代码
$a = 0;
$a && $a = 1;
echo $a;
如您所见,$a
现在是falsy。因此,该顺序阻止脚本更改值,脚本从
注意:虽然
=
的优先级低于大多数其他运算符,但PHP仍然允许类似以下表达式:如果(!$a=foo())
,则foo()
的返回值被放入$a
中
文档没有指定此时遵循的规则,但我们可以推断您的代码与此等效:
$a && ($a = 1)
因为&&
是“懒惰”的,因为如果它发现一个参数为false,它就不会费心计算进一步的参数,这意味着$a
只有在它以前持有truthy值的情况下才会设置为1
(在您的例子中,2
是truthy)。如果您设置了$a=0
,那么它将保持0
与
$a && $a = 1;
注意:虽然
=
的优先级低于大多数其他运算符,但PHP仍然允许类似以下表达式:如果(!$a=foo())
,则foo()
的返回值被放入$a
中
文档没有指定此时遵循的规则,但我们可以推断您的代码与此等效:
$a && ($a = 1)
因为&&
是“懒惰”的,因为如果它发现一个参数为false,它就不会费心计算进一步的参数,这意味着$a
只有在它以前持有truthy值的情况下才会设置为1
(在您的例子中,2
是truthy)。如果您设置了$a=0
,那么它将保持0
$a && $a = 1;
是布尔类型的表达式。由于$a
是真实的,表达式的计算将继续到第二部分,即赋值。作为作业的一个副作用,$a
现在适用于1
如果$a
在开始时为0,那么它在结束时将保持为0,因为表达式的计算将在测试第一个条件后立即终止
是布尔类型的表达式。由于$a
是真实的,表达式的计算将继续到第二部分,即赋值。作为作业的一个副作用,$a
现在适用于1
如果
$a
在开始时为0,那么它在结束时将保持为0,因为表达式的计算将在测试第一个条件后立即终止。那么,您预期会发生什么?@NiettheDarkAbsol:我希望这会产生某种错误@NiettheDarkAbsol作为文档,它应该被解释为($a&&$a)=1,那么应该有语法错误。那么,你认为会发生什么?@NiettheDarkAbsol:我希望这会产生某种错误@NiettheDarkAbsol作为doc,它应该被解释为($a&&&$a)=1,那么应该有语法错误,但是正如OP所说,&&&
的优先级高于赋值。因此OP的代码应等于($a&&$a)=1
@OliCharlesworth这不是有效代码有什么区别吗?卫斯理默奇:也许吧。PHP运算符的规则也是“遵循优先级表,除非这会导致一些无意义的结果,在这种情况下,请尝试…其他东西”?但正如OP所说,&&
的优先级高于赋值。因此OP的代码应等于($a&&$a)=1
@OliCharlesworth这不是有效代码有什么区别吗?卫斯理默奇:也许吧。那么,PHP操作符的规则是否“遵循优先级表,除非这会导致一些无意义的结果,在这种情况下,请尝试…其他东西”?我认为“还”这句话在这里没有任何关联;评估顺序和优先级通常是不相关的主题。@OliCharlesworth我认为这有助于强调评估顺序可能并不总是准确的,但我可能会将其解释为错误的。优先级是关于如何构建的。第二句话是指像a()+b()
;没有定义是先对a
还是b
求值(即调用)。@OliCharlesworth啊,我明白了。这是有道理的。我同意@OliCharlesworth对报价的看法,但关键在于“否则您的作业将有一个无效的左手边”
。这就是为什么它是这样的主要原因:它不能以不同的顺序进行评估;评估顺序和优先级通常是不相关的话题。@OliCharlesworth我认为这会有所帮助