2012-02-25 128 views
4

Cprogramming.com我發現這段代碼:通過「b =(a + b) - (a = b)」進行交換是否安全?

int a,b; 
scanf("%d %d",&a,&b); 
b=(a+b)-(a=b); 
printf("%d %d",a,b); 

它被要求是一個塞尖/特技爲「互換,而無需使用臨時」。我在Linux gcc上的測試證明了它。但是,編譯器或者計算這個表達式的平臺在這裏的順序會不會有所不同?使用這樣的代碼安全嗎?

+3

是的,因爲使用臨時變量是一件很糟糕的事! – 2012-02-25 18:21:25

+0

關於這個[「技巧」](http://stackoverflow.com/questions/8265641/switch-two-values-without-temp-storage)的最新討論,擴展了@DavidHeffernan提到的內容。 – 2012-02-25 21:00:19

回答

12

號在該表達式中(a+b)-(a=b)a之間沒有序列點被寫入並a(a+b)子表達式被讀取以確定該值被存儲到b這樣的行爲是未定義。

+1

即使有序列點,但由於潛在的整數溢出,它仍然不可移植;另見http://en.wikipedia.org/wiki/XOR_swap_algorithm#Variations – Christoph 2012-02-25 16:49:01

8

但是,在這裏計算這個表達式的編譯器或者平臺不會有多麼不同?

是的。

使用這樣的代碼安全嗎?

不,這是未定義的行爲。

相關問題