2011-10-14 11 views
2

語境的ActiveState Perl的: 這是Perl 5中,12版,顛覆4(v5.12.4)爲MSWin32 86多線程構建爲什麼Perl的bignum模塊爲我的功耗計算提供了一個奇怪的結果?

>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 

那麼爲什麼所有的括號?

+3

使用'use warn ';(或'-w')!!! – ikegami

回答

9

This thread涵蓋了你的兩個問題(你必須稍微查找對應於print (-2) ** 32的部分)。

總結還有什麼:

  • 對於你的第一個問題(perl -Mbignum=l -e "print -2 ** 32"):在Perl冪比目負更高的優先級。
  • 對於第二個問題(perl -Mbignum=l -e "print (-2) ** 32"):關鍵是print文檔中的以下警告。

    還要注意不要使用左括號跟隨print關鍵字,除非您想讓相應的右括號終止打印的參數 - 插入a或在所有參數周圍插入括號。

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)爲被稱爲與-2爲參數的函數print)。

3

它不是一個BIGNUM相關的問題,如果你試試這個:

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

你:-2

那麼「問題」與打印功能的參數格式

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 
相關問題