2013-08-22 53 views
2

這是一個我無法清楚解釋的問題。關於序列點和UB


哪個選項是錯誤的,爲什麼?

(A) a += (a++); 
(B) a += (++a); 
(C) (a++) += a; 
(D) (++a) += (a++); 

是什麼AB之間的區別?

我明白了: A是UB,但B是可以的,因爲++a的副作用將在分配前完成。是對的嗎?

更新:在序列點內++aa++之間有什麼區別?預增量(減量)的副作用可能在下一個seq點之前的任何時間完成,就像後增量(遞減)一樣?

+0

選擇題! – devnull

+0

@devnull是的。但我想清楚的原因。 – Donglei

+0

看看選項'a + =(++ a);'這樣''a = a + ++ a;' – 0decimal0

回答

6

哪個選項錯誤,爲什麼?

所有這些都是錯誤的,這是因爲前兩個調用未定義的行爲,最後兩個不編譯。 (如果他們這樣做,他們也會調用UB。)

+0

爲什麼第二個是UB? 'a + =(++ a)'等於'++ a; a + = a;' – Donglei

+4

@董磊哦? [賦值不是一個序列點。](http://stackoverflow.com/questions/4362501/any-good-reason-why-assignment-operator-isnt-a-sequence-point) – 2013-08-22 14:17:28

+0

是的,我知道任務不是一個順序點。你能解釋序列點中'++ a'和'a ++'之間有什麼區別嗎?我的理解是:在返回之前,預增加將會是'++',所以'++ a'之後副作用已經發生。 – Donglei

3

第一個和第二個是UB,因爲C沒有定義什麼應該首先被評估。

第三和第四,不進行編譯 - 原因:lvalue required as left operand of assignment

讓我對前兩個更具體:

a += (a++); - 等於a = a + (a++);

  • 如果a++評估首先它是a = a + 1 + a;
  • 如果a++在最後評估那麼它是a = a + a;

但是C沒有定義先發生什麼,所以它取決於實現,它是UB。

第二種情況也是如此。

+0

@JonathanLeffler它能讓惡魔從你的鼻子裏飛出來嗎? XD –

+0

這取決於編譯器編寫者的技巧!我刪除了我的評論;我對此並不滿意。我們也刪除這兩個。 –