[問題] A[x++] = --x

看板C_and_CPP (C/C++)作者 (Cal)時間3年前 (2021/08/31 12:08), 3年前編輯推噓29(312146)
留言179則, 24人參與, 最新討論串1/3 (看更多)
開發平台(Platform): (Ex: Win10, Linux, ...) Win10 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) GCC 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): 遇到題目問這題的輸出,我的想法是先將x=x-1 後續就不太知道該怎麼判斷,而且用兩個ide跑出的結果不同 int main() { int A[3] = {0, 0, 0}; int x = 1; A[x++] = --x; printf("A[0]=%d, A[1]=%d, A[2]=%d", A[0], A[1], A[2]); } 餵入的資料(Input):預期的正確結果(Expected Output): 用code block跑出來是 A[0]=1, A[1]=0, A[2]=0 https://i.imgur.com/3UGzFqf.jpg
用線上ide codechef跑出來是 A[0]=0, A[1]=1, A[2]=0 https://i.imgur.com/oYd3YFB.jpg
錯誤結果(Wrong Output): 程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔) 已於上述列出 麻煩各位大大 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.136.255.127 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1630382935.A.E4F.html

08/31 12:12, 3年前 , 1F
這是undefined behavior 請參考sequence point
08/31 12:12, 1F

08/31 12:39, 3年前 , 2F
置底十三誡之八
08/31 12:39, 2F

08/31 14:02, 3年前 , 3F
聽說現在2021年 希望2031不要再有這種問題 雖然這問題我200
08/31 14:02, 3F

08/31 14:02, 3年前 , 4F
1就見過
08/31 14:02, 4F
題目不是我出的啊大哥,遇到我也很困擾,不知道怎麼解

08/31 14:24, 3年前 , 5F
同學去面大M 題目還是有同個 expression 多次對同樣變
08/31 14:24, 5F

08/31 14:24, 3年前 , 6F
數加減
08/31 14:24, 6F
這種真的是各種考試很愛考

08/31 14:51, 3年前 , 7F
這C++17有規範不是嗎?
08/31 14:51, 7F
※ 編輯: CaliforCat (114.136.255.127 臺灣), 08/31/2021 16:33:27

08/31 18:09, 3年前 , 8F
垃圾題,但我想台灣2041還會繼續出這種題目
08/31 18:09, 8F

08/31 20:31, 3年前 , 9F
謝謝樓上M大提點,翻了規格跟置底以後才發現QQ
08/31 20:31, 9F

09/02 12:47, 3年前 , 10F
這種看不出功力的白癡題一堆人很愛考
09/02 12:47, 10F

09/02 12:47, 3年前 , 11F
還有operator precedence 也是 是來寫軟體還是來
09/02 12:47, 11F

09/02 12:48, 3年前 , 12F
被課本的阿
09/02 12:48, 12F

09/02 12:48, 3年前 , 13F
怎麼要考這種 怎麼不叫面試者把linux kernel默寫下來
09/02 12:48, 13F

09/02 14:40, 3年前 , 14F
更,以前某公司筆試不是考op precedence 是考整題
09/02 14:40, 14F

09/02 14:40, 3年前 , 15F
expr evaluation
09/02 14:40, 15F

09/02 14:41, 3年前 , 16F
那公司裡面暗暗的 感覺會發霉
09/02 14:41, 16F

09/02 14:42, 3年前 , 17F
喔對 不是只考一題 是考一堆的最後一題expr evaluation
09/02 14:42, 17F

09/03 01:03, 3年前 , 18F
不該寫出這種code的題目實在不該出....
09/03 01:03, 18F

09/03 04:50, 3年前 , 19F
一模一樣耶,484有人以為用置底出題就叫考試
09/03 04:50, 19F

09/03 12:56, 3年前 , 20F
考這個真的很無聊
09/03 12:56, 20F

09/03 12:57, 3年前 , 21F
進公司狂寫這種code 看看主管爽不爽
09/03 12:57, 21F

09/03 13:43, 3年前 , 22F
要考也應該是考這種code爛在哪邊XD
09/03 13:43, 22F

09/03 13:45, 3年前 , 23F
C++17雖然有定序了 但我記得C的standard還沒定吧?
09/03 13:45, 23F

09/03 13:46, 3年前 , 24F
而且不管有沒有定 都不會改變這個寫法就是爛的事實
09/03 13:46, 24F

09/05 17:32, , 25F
鳥題目+1 實務上code review不會過
09/05 17:32, 25F

09/06 00:07, , 26F
那不好說XD
09/06 00:07, 26F

09/06 11:18, , 27F
如果是C++17, 這題答案是?
09/06 11:18, 27F

09/07 06:34, , 28F
應該查記錄看這行垃圾是誰寫的 然後拿棒球棍揍他
09/07 06:34, 28F

09/07 11:48, , 29F
結果發現是經理 XDDDDD
09/07 11:48, 29F

09/08 02:32, , 30F
就算有定義還是爛寫法啊 直接衝擊可讀性
09/08 02:32, 30F

09/08 17:16, , 31F
那就要看看樓上說的「可讀性」用的是什麼指標了
09/08 17:16, 31F

09/08 17:23, , 32F
一般常用的 McCabe's CC (Cyclomatic Complexity) 在
09/08 17:23, 32F

09/08 17:23, , 33F
分行寫或併在一起都不會影響複雜度. 那會衝擊可讀性
09/08 17:23, 33F

09/08 17:23, , 34F
的點是?
09/08 17:23, 34F

09/09 07:33, , 35F
樓上可讀性跟複雜度無關阿 變數名稱取aaabb123232cc
09/09 07:33, 35F

09/09 07:33, , 36F
函式名稱取djsadoi_jasdj_jasdjadiasd__dasd()
09/09 07:33, 36F
還有 103 則推文
09/12 22:57, , 140F
我的重點. UB 都是一樣的, 會覺得"這種"考到煩是開始
09/12 22:57, 140F

09/12 22:57, , 141F
有差別待遇, 一份至少有 3 個地方會踩到 UB 的程式碼
09/12 22:57, 141F

09/12 22:57, , 142F
, 只糾結執行順序的問題我也看不出是什麼操作
09/12 22:57, 142F

09/13 10:58, , 143F
orz 你看不出來的操作很簡單,是這樣的:
09/13 10:58, 143F

09/13 10:58, , 144F
這些題目 100/100 考的是教授個人以為的 C,不是什麼神奇
09/13 10:58, 144F

09/13 10:58, , 145F
未來 2050 C++ 抽象機器,而在過去目前甚至是可預見的未
09/13 10:58, 145F

09/13 10:58, , 146F
來的 C 裡面,這個 expression 100/100 是 UB
09/13 10:58, 146F

09/13 10:58, , 147F
meaning that:
09/13 10:58, 147F

09/13 10:58, , 148F
1. 對考生來講這題沒有教授要的答案
09/13 10:58, 148F

09/13 10:58, , 149F
(你根本不知道教授以為的答案是哪一種)
09/13 10:58, 149F

09/13 10:58, , 150F
2. 這題很無聊/沒有鑑別度/考了不知道要幹嘛
09/13 10:58, 150F

09/13 10:58, , 151F
(如版友們的推文不一一列舉)
09/13 10:58, 151F

09/13 10:58, , 152F
然後讓我們來回答你提出的問題:
09/13 10:58, 152F

09/13 10:58, , 153F
1. 「難道 UB 還要分這種 UB 和別種 UB 嗎」
09/13 10:58, 153F

09/13 10:58, , 154F
原來是把上次的坡拿來繼續滑的部分啊,我懂你的邏輯
09/13 10:58, 154F

09/13 10:58, , 155F
a. 因為就連像 i+1 這樣一般的 expr 都可能是 UB
09/13 10:58, 155F

09/13 10:58, , 156F
-> b. 所以什麼 expr 都可能是 UB
09/13 10:58, 156F

09/13 10:58, , 157F
-> c. 所以整份 code 到處都是 UB,無法縮小需要檢查的範
09/13 10:58, 157F

09/13 10:58, , 158F
圍或是針對某部分 code 找出需要檢查的 UB 種類
09/13 10:58, 158F

09/13 10:58, , 159F
-> d. 所以 UB 就是 UB,沒有分這種 UB 那種 UB
09/13 10:58, 159F

09/13 10:58, , 160F
-> e. 所以不能針對某些特殊(例如100%發生)的 UB 做其
09/13 10:58, 160F

09/13 10:58, , 161F
他處理,否則就是糾結在某種 UB,而且是對 UB 的差別待遇
09/13 10:58, 161F

09/13 10:58, , 162F
哇~真是神奇的邏輯呢,如果這不是滑坡什麼才是滑坡呢?
09/13 10:58, 162F

09/13 11:05, , 163F
XD 他會跟你解釋 有一種CPU跟compiler int只有1 bit
09/13 11:05, 163F

09/13 11:06, , 164F
所以寫c語言 int i=2 就會UB 你要注意 XD
09/13 11:06, 164F

09/13 11:07, , 165F
真的要這樣搞 你可以用 configure.sh
09/13 11:07, 165F

09/13 11:08, , 166F
或是用preprocessor做靜態檢查就好了 無限延伸這議題
09/13 11:08, 166F

09/13 11:09, , 167F
有什麼用 想到以前工作 也有個工程師很鑽牛角尖
09/13 11:09, 167F

09/13 11:10, , 168F
我寫給他chip i2c的函式庫給他用 他就在質疑 有沒有
09/13 11:10, 168F

09/13 11:10, , 169F
error hanlding 我說我有做i2c error handle了
09/13 11:10, 169F

09/13 11:11, , 170F
他繼續問 有沒有可能i2c寫成功 chip register 沒改變
09/13 11:11, 170F

09/13 11:12, , 171F
這有沒有檢查 或是register值寫進去了 示波器量出來
09/13 11:12, 171F

09/13 11:12, , 172F
沒變 這有沒有做error handing....我當場無言...
09/13 11:12, 172F

09/13 21:23, , 173F
合理懷疑樓上是在釣 L 大出來指正 int 大小規範
09/13 21:23, 173F

09/13 21:27, , 174F
是在寫火箭發射器膩XD
09/13 21:27, 174F

09/13 22:23, , 175F
要挑剔UB 原文的例子也太多 講不玩了
09/13 22:23, 175F

09/13 22:23, , 176F
誰說 int A[3] = {0, 0, 0} 一定會成功?
09/13 22:23, 176F

09/13 22:24, , 177F
搞不好程式根本沒stack size了 一宣告變數就爆了
09/13 22:24, 177F

09/13 22:29, , 178F
還有print字串那麼長 萬一機器只有12byte 記憶體怎麼辦
09/13 22:29, 178F

09/14 07:18, , 179F
現實誰會這樣寫?XD想知道
09/14 07:18, 179F
文章代碼(AID): #1XBQjNvF (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1XBQjNvF (C_and_CPP)