关于逻辑运算符&&;在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我认为这会有所帮助