[閒聊] i++ is undefined behavior?

看板Soft_Job作者 (阿懋)時間9年前 (2015/04/24 23:22), 編輯推噓4(4030)
留言34則, 14人參與, 最新討論串1/6 (看更多)
最近因為同事在code review時表示 i++會隨編譯器實作而有不同行為 所以要求我不要用這種寫法,到這邊應該很多人會說:"沒錯啊,這你都不懂?" 關鍵在於他舉的例子是這樣的 i=10; val = array[i++]; val equals array[10] or array[11]? 我整個傻住了,我的理解是,答案絕對是val=array[10] 而隨編譯器會變化的地方是,在該expression/statement所構成的 數個指令中"遞增"的時機可能不同,所以如果在一個expression中存取i 兩次以上會造成未定義行為 但suffix increament operator必定是先return再遞增 請問我的理解才是錯的嗎? 那GLIBC裡的strcmp實作也是不可靠的嗎? https://fossies.org/dox/glibc-2.21/string_2strcmp_8c_source.html 還有另一個例子是說const global variable is better than Macro?? 理由是global variable只有一份、用再多次也只是reference同一份 但是macro假設被使用10次就會造成code size增加10倍 用來舉例的型別是int 這也是顛覆了我一直以來的觀念,讓我相當震撼 我應該趕快請前輩喝飲料順便多請教他,還是趁試用期還沒過趕快離職? 請各位給我一些意見,感謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 175.181.142.174 ※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1429888933.A.36A.html

04/24 23:34, , 1F
寫個反例就可以知道結果。show me the code
04/24 23:34, 1F

04/24 23:38, , 2F
請問反例是指?
04/24 23:38, 2F

04/24 23:47, , 3F
const global variable 比 macro 大
04/24 23:47, 3F

04/25 00:01, , 4F
用const global variable是對的, 但理由不是size
04/25 00:01, 4F

04/25 00:02, , 5F
i++當然不是先 return 再遞增, 是先遞增再 return
04/25 00:02, 5F

04/25 00:02, , 6F
更多人選擇使用static const,為的是提供型別安全
04/25 00:02, 6F

04/25 00:02, , 7F
舊值給你
04/25 00:02, 7F

04/25 00:03, , 8F
i++那個你講的應該是對的
04/25 00:03, 8F

04/25 00:04, , 9F
等等,好像L大講的比較正確一點@@
04/25 00:04, 9F

04/25 00:08, , 10F
感謝L大指教 不過我的重點在return回來的值 不過表達不當
04/25 00:08, 10F

04/25 00:09, , 11F
還有他會因為編譯器不同而造成return遞增後的值回來嗎?
04/25 00:09, 11F

04/25 00:10, , 12F
atst2說的我知道 感謝回覆
04/25 00:10, 12F

04/25 00:12, , 13F
04/25 00:12, 13F

04/25 00:13, , 14F
就我所知,第一個就像你講的那樣~
04/25 00:13, 14F

04/25 00:23, , 15F
The value obtained by applying a postfix ++ is the
04/25 00:23, 15F

04/25 00:24, , 16F
value that the operand had before applying the operator
04/25 00:24, 16F

04/25 00:25, , 17F
舊版的c++standard是這樣說的,新的不知道有沒有改.
04/25 00:25, 17F

04/25 00:42, , 18F
多次"寫讀"同一變數才是undefined吧? 是不是記錯啦?
04/25 00:42, 18F

04/25 00:43, , 19F
marco這個說法也怪怪的 應該先問他macro怎麼定義 然後用
04/25 00:43, 19F

04/25 00:44, , 20F
const global variable有一用意是型別安全 且macro置換常
04/25 00:44, 20F

04/25 00:45, , 21F
會有置換出乎意料跟同名macro造成的bug
04/25 00:45, 21F

04/25 00:46, , 22F
叫他不要打高空, 怎樣的情況會造成語意錯誤說來聽聽
04/25 00:46, 22F

04/25 01:17, , 23F
macro vs global variable指的是常量 所以我才特指int
04/25 01:17, 23F

04/25 01:18, , 24F
type safe這點是在c++適用 c就沒差了XD
04/25 01:18, 24F

04/25 01:41, , 25F
macro定義是常量的話....用variable開-O該不會也是被換成
04/25 01:41, 25F

04/25 01:41, , 26F
一個常量吧 也就是都是像: int newVar = 12 之類的 XDDDD
04/25 01:41, 26F

04/25 01:43, , 27F
以上猜測啦 不要打我(畢竟還要多產生取variable值的code)
04/25 01:43, 27F

04/25 02:00, , 28F
實務上很少會用那種裝神弄鬼的寫法...是想搞死自己嗎XDD
04/25 02:00, 28F

04/25 08:23, , 29F
就是有這種吃飽太閒的人
04/25 08:23, 29F

04/25 20:48, , 30F
你那同事一知半解  
04/25 20:48, 30F

04/26 01:18, , 31F
系統資源有少到需要斤斤計較幾K的記憶體消耗嗎?
04/26 01:18, 31F

04/26 08:45, , 32F
我會儘量奉行「一行程式碼只做一件事」這原則
04/26 08:45, 32F

04/27 21:00, , 33F
http://ppt.cc/AREM 關於++, 我原本想的跟你同事一樣
04/27 21:00, 33F

04/27 21:01, , 34F
不過查了一下你說的似乎才是對的
04/27 21:01, 34F
文章代碼(AID): #1LEb-bDg (Soft_Job)
討論串 (同標題文章)
文章代碼(AID): #1LEb-bDg (Soft_Job)