看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《XYX16888 (XYX)》之銘言: : MAC OS / xcode 4 compile : code : : int main(void) : { : const int var = 10; : int *vptr = &var; : *vptr = 20; : printf("%d\n", var); ^^^ compile 到這一行的時候 聰明的 compiler 發現 var 是常數 所以不需要再從記憶體中取值了 直接把 10 拿來傳進 printf 即可 這叫 constant propagation 是相當基本的最佳化技術 : 想請問*vptr 到底改到哪裡的值? : 明明不是有把var的地址assign給vptr嗎? : 結果因為var是const 變數 因此 assign *vptr為20時 到底改到哪裡的值? : 謝謝 因為你跟 compiler 說 var 是常數 所以他假設 *vptr 不管發生什麼事,var 都固定是 10 但是 compiler 並沒有義務一定要做 constant propagation 也就是即使他輸出 20 那也不是他的責任 試圖寫入常數是 undefined behavior 上述的 code 在 C++ 中甚至直接視為 compile error -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.32.15.163
james732:[讚] 07/05 14:28
angleevil:當別人已經回答undefined behavior,發問者就要好好想 07/05 14:31
angleevil:錯在哪了,如果這程式是核彈程式,你早就歸天了. 07/05 14:32
ledia:還好啦, undefined 是要看運氣歸天 (誤) 07/05 14:35
XYX16888:我只是在做測試 故意寫錯 然後了解整個過程 二樓說的太 07/05 14:37
XYX16888:嚴重了吧@@ 07/05 14:37
angleevil:undefined behavior是經常再折磨工程師的肝,所以真的沒 07/05 14:42
angleevil:誇大效果. 07/05 14:43
tropical72:我覺得花時間在 try undefined behavior 很沒效率, 07/05 16:38
tropical72:應有更多 topic 可以玩,知道那是 U.B. 就別再試了. 07/05 16:38
tropical72:應要搞的話,下面問題搞死不少人 07/05 16:45
tropical72:http://codepad.org/jXUAI5tE 07/05 16:45
VictorTom:[讚] 07/05 23:13