雖然尋找到Can you have a incrementor and a decrementor on the same variable in the same statement in c爲什麼C++接受多個前綴,而不是後綴的變量
我發現,你可以在一個變量幾個前綴遞增/遞減運算,但只有一個後綴
例如:
++--++foo; // valid
foo++--++; // invalid
--foo++; // invalid
這是爲什麼?
雖然尋找到Can you have a incrementor and a decrementor on the same variable in the same statement in c爲什麼C++接受多個前綴,而不是後綴的變量
我發現,你可以在一個變量幾個前綴遞增/遞減運算,但只有一個後綴
例如:
++--++foo; // valid
foo++--++; // invalid
--foo++; // invalid
這是爲什麼?
這是由於這樣的事實,在C + +(但不是C),的++x
結果是左值,這意味着它是可分配的,因此鏈能。
但是,x++
的結果不是一個值,而是一個prValue,意味着它不能被分配,因此不能鏈接。
在C++語言的前綴遞增/遞減運算返回左值,而後綴的人返回右值。同時,所有修改操作符都需要左值參數。這意味着前綴遞增/遞減的結果可以傳遞給需要左值參數(包括附加增量/遞減)的任何其他附加運算符。
在C同樣的原因,++,你可以這樣寫代碼
int i = 0;
int *p = &++i;
這將增加i
並p
點i
。一元&
需要左值操作數,這就是爲什麼它將使用前綴++
(但不包含後綴1)的結果。
具有應用於同一對象的多個內置前綴增量/減量的表達式產生未定義行爲,但它們仍然是格式良好的(即「可編譯的」)。
像++foo--
這樣的表達式是無效的,因爲在C++中,後綴運算符比前綴運算符具有更高的優先級。大括號可以改變這一點。例如,(++foo)--
是一個格式良好的表達式,儘管會再次導致未定義的行爲。
你可以顯示一些說明結果未定義的文檔嗎?在我看來,它應該是完全明確的(從右向外評估)。 – 2012-07-26 23:37:46
@ RichardJ.RossIII UB因爲*(C++ 11,1.9p15)「如果對標量對象的副作用不是相對於同一標量對象的其他影響或使用相同標量對象的值進行值計算,行爲是未定義的。「* – ouah 2012-07-26 23:41:10
@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
相關:http://stackoverflow.com/a/3601661/706836 – Pyrodante 2012-07-26 23:34:31