my $x = 1;
$x = $x * 5 * ($x += 5);
我希望$x
是180
:
$x = $x * 5 * ($x += 5); #$x = 1
$x = $x * 5 * 6; #$x = 6
$x = 30 * 6;
$x = 180;
180;
但取而代之的則是30
;但是,如果我更改條款的順序:
$x = ($x += 5) * $x * 5;
我得到180
。我很困惑的原因是perldoc perlop
很清楚地說:
TERM在Perl中的優先級最高。它們包括變量, 引用和引用類運算符,括號中的任何表達式和任何其參數括在括號內的函數 。
由於($x += 5)
位於括號內,因此它應該是一個術語,因此無論表達式的順序如何,都應該先執行。
你知道,先學習過C,我從來沒有做過這樣的事情,並期望它按照我認爲應該工作的方式工作:http://c-faq.com/expr/index.html ;-) – 2009-11-05 17:51:12
我也來自ANSI C,是的,這不是我要寫的代碼,而是我在確定我理解Perl中的優先級之前,先向別人解釋它。使用這樣的副作用是一個主要的禁忌,但在Perl中仍然合法。在ANSI C中,如果在表達式中有多個副作用,那麼結果是未定義的,但在Perl中,副作用更好定義,但仍然是一個非常糟糕的主意。 – 2009-11-05 18:12:11
我曾經對comp.lang.perl.misc做過一篇關於這個帖子的可愛帖子,並且從未能夠再次找到它。 – 2009-11-06 18:42:07