2016-11-18 48 views

回答

1

您的代碼依賴於標準未涵蓋的行爲。因此,您的代碼在不同的編譯器,同一編譯器的不同版本上可能會有不同的表現,甚至根據周圍的代碼行爲也會有所不同。

問題是,您評估並分配到tab[i+1]沒有分離序列點。對你來說看起來很明顯,你的程序將從左到右執行計算,但C標準不要求這樣做。編譯器可以將您的代碼編譯爲:

tab[i+1] = tab[i]; 
tab[i] = tab[i+1] - tab[i] + tab[i+1]; 

作爲單獨的說明。交換兩個變量是一種高度優化的和容易識別操作,任何優化的編譯器會選擇最快的指令,如果你寫:

int temp = tab[i]; 
tab[i] = tab[i+1]; 
tab[i+1] = temp; 
+0

感謝你爲這個非常全面和教學響應! – residue

相關問題