【问题标题】:Perl xor returns unexpected resultPerl xor 返回意外结果
【发布时间】:2017-08-08 23:31:14
【问题描述】:

这里发生了什么?为什么不是 $c == 1 ?

$ cat y.pl
#!/usr/bin/perl
$a = 0;
$b = 1;
$c = $a xor $b;
print "$a ^ $b = $c\n";

$ ./y.pl 
0 ^ 1 = 0

【问题讨论】:

  • 始终使用use strict; use warnings qw( all );!!!
  • 另外:不要使用单字母变量名。如果您必须,那么$a$b 是不好的选择,因为它们被sort 使用。

标签: perl xor


【解决方案1】:

一直使用

use strict;
use warnings qw( all );

它会检测到您的优先级问题。

Useless use of logical xor in void context

具体来说,

$c = $a xor $b;

意思

($c = $a) xor $b;

运算符andornotxor 的优先级很低。这使得andornot 对于流量控制非常有用。

... or die ...;
... or next;

xor 不会短路,因此对流量控制没有用处。 xor 是出于完全不同的原因而创建的。与or 一样,xor 是一个逻辑运算符。这意味着将其操作数的真实性视为整体,而不是进行逐位比较。我不相信这是你想要的操作。

修复:

$c = $a ^ $b;

                                    Low
                                    Precedence
Operation   Bitwise     Logical     Logical
----------  ----------  ----------  ----------
NOT         ~           !           not
AND         &           &&          and
OR          |           ||          or
OR*         N/A         //          N/A
XOR         ^           N/A         xor

OR* - Like OR, but only undefined is considered false.

【讨论】:

    【解决方案2】:

    赋值的优先级高于异或。随便写:

    $c = ($a xor $b);
    

    【讨论】:

    • ...use strict; use warnings 告诉您,这就是您应该始终使用它的原因。
    • 1 xor 3 返回 false (dualvar(0, "")),因为 xor 是逻辑运算符。另一方面,1 ^ 3 返回2,因为^ 是位运算符。我认为 OP 想要后者,尽管很难从他们的例子中看出。
    猜你喜欢
    • 2014-07-01
    • 2017-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多