【问题标题】:Xor returns true when two side are true - PHP [duplicate]当两侧为真时,Xor 返回真 - PHP [重复]
【发布时间】:2020-01-07 15:21:11
【问题描述】:

据我所知,当两个变量为真时,Xor 应该返回假

但是我试过了,还是不行!

$n1 = true;
$n2 = true;
$res = $n1 xor $n2;
echo var_dump($res);

【问题讨论】:

    标签: php


    【解决方案1】:

    优先级。您的第三个语句被评估为

    ($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);
    

    为了进一步解释,请注意有两组逻辑运算符,唯一的区别是它们绑定的紧密程度。 andorxor 绑定非常松散,而它们的对应 &&|| 绑定更紧密。不幸的是,xor 没有紧密绑定对应。这些操作符是从 Perl 中引入的,其中一个常见的习惯是使用松散绑定的操作符进行流控制:

    $f = doSomethingThatMightBeFalsy() or die("I failed at my task");
    

    它将分配$f,如果该值最终是虚假的,则死亡。这不同于

    $f = doSomethingThatMightBeFalsy() || die("I fail evrytym :(");
    

    tl;dr:正如 Akam 已经写的那样,您应该明确使用括号来使 xor 绑定比赋值更紧密。

    【讨论】:

    • 这是如何工作的? $n1 到左边让它为假?
    • $n1 (true) 被分配给$res。然后xor 运算符在它和$n2 之间执行,但没有分配给任何东西。
    【解决方案2】:

    这是因为PHP Operator Precedence。 下面的例子是正确的

    $n1 = true;
    $n2 = true;
    $res = ($n1 xor $n2);
    echo var_dump($res); // bool(false) 
    

    【讨论】:

      猜你喜欢
      • 2022-01-02
      • 1970-01-01
      • 2018-04-18
      • 2021-07-08
      • 2019-04-18
      • 2011-09-07
      • 1970-01-01
      • 2019-06-07
      • 1970-01-01
      相关资源
      最近更新 更多