2

上下文:ActiveState Perl:这是为 MSWin32-x86-multi-thread 构建的 perl 5,版本 12,subversion 4 (v5.12.4)

>perl -Mbignum=l -e "print 2 ** 32"
4294967296

>perl -Mbignum=l -e "print -2 ** 32"
-4294967296

然后我开始思考,也许我需要划定负面的两个。

>perl -Mbignum=l -e "print (-2) ** 32"
-2

终于想通了。

>perl -Mbignum=l -e "print ((-2) ** 32)"
4294967296

那么为什么所有的括号?

4

4 回答 4

9

该线程涵盖了您的两个问题(您必须往下走一点才能找到与 对应的部分print (-2) ** 32)。

总结一下有什么:

  • 对于您的第一个问题 ( perl -Mbignum=l -e "print -2 ** 32"):在 Perl 中,求幂比一元否定具有更高的优先级。

  • 对于第二个问题(perl -Mbignum=l -e "print (-2) ** 32"):关键是print文档中的以下警告。

    还要注意不要在 print 关键字后面加上左括号,除非您希望相应的右括号终止 print 的参数——插入一个 + 或在所有参数周围加上括号。

于 2011-10-14T06:43:20.913 回答
4

我认为这与 bignum 无关。

$ perl -MO=Deparse -e "print 2 ** 32"
print 4294967296; # regular case
$ perl -MO=Deparse -e "print -2 ** 32"
print -4294967296; # ** has higher precedence than -
$ perl -MO=Deparse -e "print (-2) ** 32"
print(-2) ** 32; # parentheses parsed as function application
$ perl -MO=Deparse -e "print ((-2) ** 32)"
print 4294967296; # finally what you want

我猜函数应用程序就是你的意思(解析print (-2)为作为参数print调用-2的函数)。

于 2011-10-14T06:43:21.303 回答
3

如果您尝试以下操作,这不是与 bignum 相关的问题:

perl -e "print (-2) + 32"

你得到:-2

所以“问题”在于打印函数的参数格式

于 2011-10-14T06:44:36.620 回答
2

如果你用变量替换你的常量,B::Deparse 会告诉你 perl 如何解析代码,所以

$ perl -MO=Deparse,-p -e " print $fa ** $fb "
print(($fa ** $fb));
-e syntax OK

$ perl -MO=Deparse,-p -e " print -$fa ** $fb "
print((-($fa ** $fb)));
-e syntax OK

$ perl -MO=Deparse,-p -e " print (-$fa ) ** $fb "
(print((-$fa)) ** $fb);
-e syntax OK

$ perl -MO=Deparse,-p -e " print ( (-$fa ) ** $fb )"
print(((-$fa) ** $fb));
-e syntax OK
于 2011-10-15T11:12:46.230 回答