在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上的測試證明了它。但是,編譯器或者計算這個表達式的平臺在這裏的順序會不會有所不同?使用這樣的代碼安全嗎?
在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上的測試證明了它。但是,編譯器或者計算這個表達式的平臺在這裏的順序會不會有所不同?使用這樣的代碼安全嗎?
號在該表達式中(a+b)-(a=b)
有a
之間沒有序列點被寫入並a
在(a+b)
子表達式被讀取以確定該值被存儲到b
這樣的行爲是未定義。
即使有序列點,但由於潛在的整數溢出,它仍然不可移植;另見http://en.wikipedia.org/wiki/XOR_swap_algorithm#Variations – Christoph 2012-02-25 16:49:01
但是,在這裏計算這個表達式的編譯器或者平臺不會有多麼不同?
是的。
使用這樣的代碼安全嗎?
不,這是未定義的行爲。
是的,因爲使用臨時變量是一件很糟糕的事! – 2012-02-25 18:21:25
關於這個[「技巧」](http://stackoverflow.com/questions/8265641/switch-two-values-without-temp-storage)的最新討論,擴展了@DavidHeffernan提到的內容。 – 2012-02-25 21:00:19