int i=5;
i = i++;
這個惱人的問題
這篇有解釋, 是
未定義行為。有些面試題目會考這個, 實在是折磨人。
我想知道前++ 與後++ 到底有什麼差別, 組合語言之前沒有祕密, 好久不見的組語再次出動了, 這次的很簡單, 我還補上圖示, 沒問題的。
|
fig1 |
後++ L22 有個 lea 指令, 這個有點難懂, 請參考以下連結。
所以在 x=i++ 後, x=5, i=6。
lea:
比较汇编指令 LEA 和 MOV
有意思的lea指令
fig1 是我分解反組譯後的圖示, 1 ~ 4 的步驟分別說明這個後++ 的行為。
|
fig2 |
那如果是 i = i++ 會怎樣, 依樣畫葫蘆, 把 x (-0xc) 用 i 代替, 而改到 -0xc, 就等於改動 -0x10, 因為現在把這兩個位址看成是同一個, 這就是 fig2 的動作, 以這個反組譯來說, i 最後會得到 5。在步驟 2 的時候, i = 6, 但是到了步驟 4, i 變成了 5。所以若是步驟 2, 4 顛倒的話, 最後結果就是 i=6。
前++ 就單純多了, 但我不知道這是不是標準行為。
所以後++ 需要多一個東西來暫存中間結果, 這就是為什麼 c++ 建議用
前++, 而少用
後++, 這樣就不需要多一個東西來暫存, 速度自然也快一些。
不過編出來的執行檔大小都一樣, 我不知道速度是不是
前++ 會快些, 不知道還有什麼魔法。
中正 研究所的 考題 似乎曾經考過類似的 印象中...
回覆刪除看到這種題目應該會罵髒話吧?
回覆刪除