Re: [問題] A[x++] = --x
※ 引述《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
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章
-1
12