2012-07-26 70 views

回答

8

這是由於這樣的事實,在C + +(但不是C),的++x結果是左值,這意味着它是可分配的,因此鏈能。

但是,x++的結果不是一個值,而是一個prValue,意味着它不能被分配,因此不能鏈接。

+1

相關:http://stackoverflow.com/a/3601661/706836 – Pyrodante 2012-07-26 23:34:31

6

在C++語言的前綴遞增/遞減運算返回左值,而後綴的人返回右值。同時,所有修改操作符都需要左值參數。這意味着前綴遞增/遞減的結果可以傳遞給需要左值參數(包括附加增量/遞減)的任何其他附加運算符。

在C同樣的原因,++,你可以這樣寫代碼

int i = 0; 
int *p = &++i; 

這將增加ipi。一元&需要左值操作數,這就是爲什麼它將使用前綴++(但不包含後綴1)的結果。

具有應用於同一對象的多個內置前綴增量/減量的表達式產生未定義行爲,但它們仍然是格式良好的(即「可編譯的」)。

++foo--這樣的表達式是無效的,因爲在C++中,後綴運算符比前綴運算符具有更高的優先級。大括號可以改變這一點。例如,(++foo)--是一個格式良好的表達式,儘管會再次導致未定義的行爲。

+0

你可以顯示一些說明結果未定義的文檔嗎?在我看來,它應該是完全明確的(從右向外評估)。 – 2012-07-26 23:37:46

+0

@ RichardJ.RossIII UB因爲*(C++ 11,1.9p15)「如果對標量對象的副作用不是相對於同一標量對象的其他影響或使用相同標量對象的值進行值計算,行爲是未定義的。「* – ouah 2012-07-26 23:41:10

+0

@Richard J. Ross III:C++語言規範(C++ 98,C++ 03)中衆所周知的第5/4段。在不干預*序列點*(SP)的情況下修改同一對象兩次是非法的(以UB意義)。 C++不定義沒有SP的內置運算符的評估順序。在沒有SP的C++中,沒有「從左向右評估」這樣的事情。任何訂單都需要干預SP。 '++ - foo'沒有順序點,因此行爲是未定義的。 C++ 11使用不同的正式方法進行排序,但基本原理保持不變。 – AnT 2012-07-26 23:41:14