2012-07-17 29 views
3

會有人請給解釋下:

中描述的「編程的Perl」一書後綴自動遞增運算符,如

時後放置,他們($a--$a++)遞增或遞減變量返回值後。

所以,我的理解,$a++從未在無效的情況下使用,導致出現了說,

他們遞增或遞減變量

但在接下來的變量的示例值從未改變:

my $a = 3; 
$a = $a++; 
say $a; #always outputs 3 

所以我的假設是,當值賦給同一個變量時沒有理由使用後自動增量,但是那麼來自「Programming Perl」的定義應該被認爲是錯誤的,因爲操作符不會影響變量,變量(至少在那個例子中)。是對的嗎?

預先提升。

+0

您有正確的假設:$ a = $ a ++是多餘的,因爲它不會增加變量直到再次訪問變量。 – squiguy 2012-07-17 20:42:01

+2

我會想像後綴自動增量運算符的僞代碼就像保存變量的舊值,增量變量,返回舊值一樣。當你這樣想的時候,很容易看出爲什麼你的代碼不會改變'a'中的內容。 – Daniel 2012-07-17 20:45:54

回答

16

爲什麼,既後綴自動遞增和自動運營商實際上是無效的情況下經常使用的完全相同,因爲它們影響變量 - 不是

您的示例工作的方式是因爲變量在之前得到後增加其舊值被分配給它。換句話說,中

my $a = 3; $a = $a++; 

...的順序就是...

1) $old_value = $a; 
2) $a = $a + 1; 
3) $a = $old_value; 

如果你在你的例子$b = $a++更換$a = $a++,和$ b的值,打印和事後$,你將清楚地看到差異:當$a變得增加(因此等於4)時,$b被賦予舊的值$a(3)。

+0

這非常指甲! – simbabque 2012-07-17 21:09:06

+0

對不起,我的英文不過是什麼意思「指甲」?對我來說,似乎是真的,除了名稱$ old_value,我個人想改爲「堆棧」。另外我要感謝@simbabque – user907860 2012-07-17 21:13:35

+1

@caligula:我的意思是說這是一個很好的解釋。 [translate.google.com](http://translate.google.com/#en|uk|This%20nails%20it!):免費! – simbabque 2012-07-17 21:18:59

10

所以我的假設是,沒有任何理由使用後自動增量 當值被分配到相同的變量,但隨後從「編程的Perl」的定義 應該被認爲是錯誤,導致操作員 做不影響變量,而是影響變量的值。是對的嗎?

我認爲這實際上是關於術語。

$a++++$a。它們都影響變量$a

my $a = 3; 
$a++; 
say $a; 

給你4,但這樣做

my $a = 3; 
++$a; 
say $a; 

的區別在於它們返回的內容。

$a++首先返回舊的值,然後遞增它。 ++$a首先執行增量,然後返回新值值。

my $a = 3; 
say $a++; 
say $a; 

爲您提供:

3 
4 

雖然:

my $a = 3; 
say ++$a; 
say $a; 

打印:

4 
4 

但你將很難分配的$a++一個變量的返回值。在另一個操作中使用它的可能性很大,首先需要使用舊值,然後增加變量。

這裏有一些很蹩腳的例子:

my $a = 3; 
say $a while $a--; 

打印:

2 
1 
0 

和:

my $a = 3; 
say $a while --$a; 

打印:

2 
1 

有些時候有些情況下,你想要0或0的東西的索引。有時你不想要它。兩者都很有用。

+0

感謝您清除@ikegami。 – simbabque 2012-07-18 07:31:49

相關問題