【发布时间】:2020-01-07 15:21:11
【问题描述】:
据我所知,当两个变量为真时,Xor 应该返回假
但是我试过了,还是不行!
$n1 = true;
$n2 = true;
$res = $n1 xor $n2;
echo var_dump($res);
【问题讨论】:
标签: php
据我所知,当两个变量为真时,Xor 应该返回假
但是我试过了,还是不行!
$n1 = true;
$n2 = true;
$res = $n1 xor $n2;
echo var_dump($res);
【问题讨论】:
标签: php
优先级。您的第三个语句被评估为
($res = $n1) xor $n2;
即首先分配发生,$res 变成 $n1 是什么(即true);赋值评估为被分配的值,因此下一步true xor $n2 被评估,产生false;但是这个值不会以任何方式存储或使用,而是被丢弃。基本上,您的代码等于
$n1 = true;
$n2 = true;
$res = $n1;
$res xor $n2; // useless
echo var_dump($res);
为了进一步解释,请注意有两组逻辑运算符,唯一的区别是它们绑定的紧密程度。 and、or 和 xor 绑定非常松散,而它们的对应 && 和 || 绑定更紧密。不幸的是,xor 没有紧密绑定对应。这些操作符是从 Perl 中引入的,其中一个常见的习惯是使用松散绑定的操作符进行流控制:
$f = doSomethingThatMightBeFalsy() or die("I failed at my task");
它将分配$f,如果该值最终是虚假的,则死亡。这不同于
$f = doSomethingThatMightBeFalsy() || die("I fail evrytym :(");
tl;dr:正如 Akam 已经写的那样,您应该明确使用括号来使 xor 绑定比赋值更紧密。
【讨论】:
$n1 (true) 被分配给$res。然后xor 运算符在它和$n2 之间执行,但没有分配给任何东西。
这是因为PHP Operator Precedence。 下面的例子是正确的
$n1 = true;
$n2 = true;
$res = ($n1 xor $n2);
echo var_dump($res); // bool(false)
【讨论】: