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

看板C_and_CPP作者 (髮箍)時間2年前 (2021/09/13 03:25), 2年前編輯推噓0(000)
留言0則, 0人參與, 最新討論串3/3 (看更多)
※ 引述《CaliforCat (Cal)》之銘言: : 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]); : } 雖然推文一致認為這題的答案會和 x++ 還有 --x 的執行順序有關, 但實際上並沒有這麼簡單. 在對陣列 A 元素做賦值以前, 有兩個條 件需要先被滿足: 1. 陣列索引是合法的 (0 ~ 2) 2. 賦予的值是合法的 (INT_MIN ~ INT_MAX) 只要其中一個前提不成立, 討論賦值結果是沒有意義的. 也就是說 當 x 值為以下其中一種, 我們都可以跳過討論執行順序: 1. -2 2. 4 3. INT_MIN 4. INT_MAX 因為只要 UB (Undefined Behavior) 已經發生, 後面所有基於這個 side-effect 的程式碼行為都是未定義的. 所以解決的策略通常是 消除最早發生的 UB; 而不是最明顯的 UB. 如果是我, 在丟出執行順序議題以前, 我會和面試官先確認 x 值不 會先導致其他的 UB, 接著才把這題直接丟棄掉. 要是有人說:「x 值不就是 1, 哪還會有其他可能?」這又是別的故事惹.. -- [P1389R1] Standing Document for SG20: Guidelines for Teaching C++ to Beginners https://wg21.link/p1389r1 SG20 Education and Recommended Videos for Teaching C++ https://www.cjdb.com.au/sg20-and-videos -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.233.156.253 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1631474754.A.B77.html ※ 編輯: loveme00835 (118.233.156.253 臺灣), 09/13/2021 03:36:04
文章代碼(AID): #1XFbH2jt (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1XFbH2jt (C_and_CPP)