2010-05-06 82 views
6

如何顯示下面的有效和無效以及它們是什麼意思。寫這段代碼的時候會出現這種情況。遞增和遞減操作符

++x = 5;  // legal 
--x = 5;  // legal 
x++ = 5;  // illegal 
x-- = 5;  // illegal 
+0

http://stackoverflow.com/questions/1860461/why-is-i-i-1-unspecified-behavior – 2010-05-06 17:53:58

+1

作業的可能重複?考題? – 2010-05-06 17:56:09

+0

不是他們倆。只是好奇知道。 – ckv 2010-05-06 17:58:17

回答

13

後綴(x ++/x--)運算符不會返回一個左值(您可以賦值的值)。

他們返回一個臨時值,它是變化

值是右值之前的變量值的副本,所以你可以寫:

y = x++,並得到X

的舊值
+0

你應該添加那些永遠不會被使用的代碼。 – 2010-05-06 18:58:26

+2

@布魯諾:爲什麼不呢?這是後增量運營商的整個觀點。 – 2010-05-06 19:01:42

7

這些都在序列點之間多次修改x的值,因此是未定義的行爲,您應該小心避免。我看不出「法律」與「非法」之間的區別在哪裏 - 因爲這種行爲是合法的,任何行爲(包括向國務卿發送各種電子郵件)完全符合標準。

5

假設問題是關於內置的++--操作符,這些語句都不是嚴格合法的。

前兩個是形成良好,即它們僅僅編譯因爲前綴增量的結果是左值。最後兩個是不合格,因爲後綴增量的結果不是一個右值,這就是爲什麼你不能分配給它。

但是,即使是前兩個也不合法,因爲它們會產生未定義的行爲。如果沒有中間順序點修改同一對象是非法的。 (還要注意的是,編譯器可以拒絕編譯生成未定義行爲的格式良好的代碼,這意味着即使是第一對也可能是不可編譯的)。

9

鑑於運算符=()和運算符++()都可以被重載,所以在不知道更多關於運算符被應用到的事物類型的情況下,代碼的作用是不可能的。

+1

好奇爲什麼這是downvoted - 該男子有一個有效的觀點。我期望OP在處理整數,但沒有提及類型。 – Puppy 2010-05-06 18:03:48

+0

我相信,如果x是非標量類型,這可能不會導致未定義的行爲。 – 2010-05-06 18:14:50

+0

@DeadMG:當人們沒有想到他們,或認爲他們太「看中」或「迂腐」時,他們就會冷靜下來。 – 2010-05-06 18:19:48

1

坦率地說,你不應該寫這個。後增量和前增量(和減量)應該只能自己使用。他們只是混淆的食譜。

+2

如果你只用它們自己,那麼後增量是一個毫無價值的運營商。 – 2010-05-06 18:08:01

+0

我認爲,當DeadMG說「在他們自己的」他的意思是不做雙重任務。他不是故意排除諸如「if(x ++){/*...*/}」之類的東西。Right,DeadMG? – 2010-05-06 18:15:59

+0

我絕對的意思是排除這些。後增量和預增量是語法糖,實際用於表達式時效果不佳。如果你迫切需要這個,手動完成,讓編譯器把它變成另一種形式。但是我不知道你有什麼可能需要它的情況。 – Puppy 2010-05-06 22:06:28

1

我能想到的唯一的地方會出現這種情況是操作符++和operator =的操作符重載。即便如此,定義並不明確。你的代碼基本上是給x添加一個,然後給它賦值5。會出現一個問題,比如爲什麼你需要在分配5之前增加x?唯一可能的解釋是如果你有某種類的++操作符以某種方式遞增內部計數器,然後賦值。不知道爲什麼需要這樣的事情。

2

++x--x給你回x(它被遞增後/遞減)。在這一點上,你可以做它想要的,包括分配一個新的值。

x++x--給你回什麼x(它只是增加之前 /遞減)。改變這個值是沒有比改變任何普通函數的返回值更有意義:

obj->getValue() += 3; // pointless