Re: [問題] preincrement和 postincrement的差別

看板C_and_CPP (C/C++)作者 (鬼翼&娃娃魚)時間16年前 (2009/04/18 18:09), 編輯推噓3(3013)
留言16則, 3人參與, 最新討論串2/2 (看更多)
※ 引述《nswrthh (xjapan)》之銘言: : a是一個變數,那麼++a和a++是哪裡不同?他們的定義各是什麼? 小弟我論等一下很快就會有人推文說為什麼不爬文/看書/google....XD 觀念性或者細節我不會說, 我們直接用簡單的例子來看看差在哪裡.... int a, b, c; a = 0; b = a++; // 會得到 b 為 0. a = 0; c = ++a; // 會得到 c 為 1. 也就是在一個statement裡, 對a的取值是在+=1之前還是+=1之後做:) 所以上面的兩個例子也可以重新拆開理解成下面這樣子的表示法.... a = 0; b = a; a += 1; a = 0; a += 1; c = a; 在有些時候, 兩者基本上沒什麼不同(也許compiler最佳化前有差異) 在有些時候, 這兩者弄錯了不是array會爆掉, 就是有錯誤結果@_@" -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.132.174.98 ※ 編輯: VictorTom 來自: 220.132.174.98 (04/18 18:13)

04/18 23:39, , 1F
上次有人鬧一個笑話:他寫了一個程式,大意是
04/18 23:39, 1F

04/18 23:40, , 2F
while (a<100) { a=a++; } 結果下場是永遠跑不完…
04/18 23:40, 2F

04/18 23:41, , 3F
喔對了,當然前面有 int a=0;
04/18 23:41, 3F

04/18 23:42, , 4F
不過這其實是eval order的問題。compiler-dependent.
04/18 23:42, 4F

04/19 00:36, , 5F
不知道為什麼看到這個自己和自己運算的statement, 就想
04/19 00:36, 5F

04/19 00:37, , 6F
到小弟剛學會用 a^=b^=a^=b; 這種方法耍帥來swap時遇到
04/19 00:37, 6F

04/19 00:39, , 7F
結果還是單純的 mov 比較快 因為 xor 沒法並行 mov 可以
04/19 00:39, 7F

04/19 00:40, , 8F
的悲劇: sort一個array, 沒注意到換了a[i]和a[i]...Orz
04/19 00:40, 8F

04/19 00:41, , 9F
阿 抱歉 原來還有要推文阿
04/19 00:41, 9F

04/19 00:43, , 10F
並行?? temp swp不會有WAR的問題嗎?_? 雖然看起來可以
04/19 00:43, 10F

04/19 00:43, , 11F
用reg rename來解決; w大不會啦, 我剛想太久了^^||
04/19 00:43, 11F

04/19 00:43, , 12F
因為我一時想不起來當初到底幹了什麼蠢事debug了半天XD
04/19 00:43, 12F

04/19 00:46, , 13F
所以有些 trick 還是要知道為何有這個 trick 存在
04/19 00:46, 13F

04/19 00:57, , 14F
其實說真的除了少用個temp我還真不知道它的trick在哪Orz
04/19 00:57, 14F

04/19 01:00, , 15F
trick就在不用temp這樣而已XD 這是CPU只有一個reg才需要
04/19 01:00, 15F

04/19 01:21, , 16F
所以有些trick應該拿來當歷史故事書看一看就好....XDDD
04/19 01:21, 16F
文章代碼(AID): #19wQRHCY (C_and_CPP)
文章代碼(AID): #19wQRHCY (C_and_CPP)