作者loveflames (咕啾咕啾魔法陣)
看板C_and_CPP
標題Re: [問題] ++ 與陣列的問題
時間Wed Mar 8 21:28:31 2017
a[x++] = --x符合E1=E2形式,先處理--x的計算與副作用
--x為前置運算,先處理副作用,x減1,這裡可以得到a[x++] = 1
再來處理a[x++]的計算與副作用
x++為後置運算,先進行計算,得到a[1],接著x加1
即a[1] = 1,x為2
對17的新規則還不熟,有誤請更正
不過老師考這個是害人,即便在17已經合法
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 180.217.248.34
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1488979714.A.705.html
1F:推 Hazukashiine: 下次老師就會加註:「請用C++17規則作答」03/08 21:30
2F:推 sinker5566: 感謝大大03/08 21:34
3F:→ loveflames: 過度重視求值順序跟運算子優先順序,我覺得害處很大03/08 22:10
4F:→ loveflames: 別人看到這種code還得去查表03/08 22:10
5F:推 descent: 為什麼 c++17 要定這個標準?03/08 22:36
6F:→ Caesar08: 因為有人發現,unspecified behavior會變成03/08 22:49
7F:→ Caesar08: undefined behavior03/08 22:49
8F:→ Caesar08: 讀p0145r3就可以知道原因了03/08 22:50
9F:→ james732: 沒有明確的定義,有帶來任何好處嗎?03/08 23:29
10F:推 wtchen: 感謝,已補充進13誡(覺得C++愈來愈龜毛)03/08 23:44
11F:→ final01: 為啥到c++17才規定...03/08 23:50
12F:→ uranusjr: 有規範是好事啦, 除非要讓它 syntax error 不然就是個雷03/09 00:03
13F:→ uranusjr: 有規則的雷總比沒規則的雷要好03/09 00:03
14F:→ loveflames: 不要過度使用就是03/09 00:08
15F:→ MOONRAKER: 不明確定義,方便compiler自由發揮。03/09 05:02
補充一個比較複雜的例子
//A為函數指標陣列,f為物件的方法
i=0;
++i = A[i++](i++,++i).f(i++);
規則
E1 = E2: E2->E1
E1 = E2: E1與E2的計算->E1的賦值
E1(E2,E3): E1->E2->E3
推導過程
a[0](i++,++i).f(i++),i=1
a[0](1,++i).f(i++),i=2
a[0](1,3).f(i++),i=3
a[0](1,3).f(3),i=4
++i為前置運算,副作用早於計算, i=5
結果為i = a[0](1,3).f(3)
※ 編輯: loveflames (60.248.56.181), 03/09/2017 13:23:34
16F:推 pili100: 這樣寫code有比較清楚嗎?定義這個感覺吃飽太閒03/09 17:44
17F:→ loveflames: 定義是需要啦,不要濫用就好03/09 17:52
18F:推 wtchen: C++17真的閒到去定義這個?03/09 18:14
19F:→ loveflames: 我這篇寫的都有定義03/09 18:27
20F:推 AstralBrain: E1(E2,E3)這裡的E2,E3應該沒規定順序?03/09 19:02
我得更正前面的結論
看到置底十三誡的f(++i,++i),沒查來源就直接套了
查規格書查半天都找不到
後來才知道在17雖然已不是undefined behavior
但仍是unspecified behavior
為避免混亂,這兩行不要理它
21F:→ loveflames: 17有規定函數參數的求值順序03/09 19:22
22F:→ loveflames: E1.E2應該要算成上面的那個,所以拿掉03/09 20:14
23F:推 wtchen: 我寫的時候是參照這裡 03/09 23:10
25F:推 wtchen: 已經把f(++i,++i)拿掉,感謝指正(真是亂到我都搞不懂) 03/09 23:12
26F:→ loveflames: 除了這個例子沒找到,其他我在規格書都有翻到 03/09 23:28
27F:→ loveflames: 大多寫在5.2節,而list-initIialization寫在其他地方 03/09 23:29
28F:→ loveflames: f(i = -1, i = -1)不是從左到右,它合法的原因是 03/09 23:33
29F:→ loveflames: 進入function前每個argument的副作用會處理完畢 03/09 23:40
30F:推 wtchen: 不懂,那f(i=-1, i=1)的話,i會是-1還是1? 03/09 23:48
31F:→ loveflames: unspecified behavior 03/10 00:15
32F:→ loveflames: 左右方向隨編譯器定的 03/10 00:18
想到一個好例子,這個有查過規格書可以掛保證
T x(E1,E2); //unspecified
T x{E1,E2}; //E1 -> E2
※ 編輯: loveflames (36.237.103.169), 03/10/2017 10:15:38