看板 C_and_CPP 關於我們 聯絡資訊
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://www.ptt.cc/bbs/C_and_CPP/M.1488979714.A.705.html
Hazukashiine: 下次老師就會加註:「請用C++17規則作答」03/08 21:30
sinker5566: 感謝大大03/08 21:34
loveflames: 過度重視求值順序跟運算子優先順序,我覺得害處很大03/08 22:10
loveflames: 別人看到這種code還得去查表03/08 22:10
descent: 為什麼 c++17 要定這個標準?03/08 22:36
Caesar08: 因為有人發現,unspecified behavior會變成03/08 22:49
Caesar08: undefined behavior03/08 22:49
Caesar08: 讀p0145r3就可以知道原因了03/08 22:50
james732: 沒有明確的定義,有帶來任何好處嗎?03/08 23:29
wtchen: 感謝,已補充進13誡(覺得C++愈來愈龜毛)03/08 23:44
final01: 為啥到c++17才規定...03/08 23:50
uranusjr: 有規範是好事啦, 除非要讓它 syntax error 不然就是個雷03/09 00:03
uranusjr: 有規則的雷總比沒規則的雷要好03/09 00:03
loveflames: 不要過度使用就是03/09 00:08
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
pili100: 這樣寫code有比較清楚嗎?定義這個感覺吃飽太閒03/09 17:44
loveflames: 定義是需要啦,不要濫用就好03/09 17:52
wtchen: C++17真的閒到去定義這個?03/09 18:14
loveflames: 我這篇寫的都有定義03/09 18:27
AstralBrain: E1(E2,E3)這裡的E2,E3應該沒規定順序?03/09 19:02
我得更正前面的結論 看到置底十三誡的f(++i,++i),沒查來源就直接套了 查規格書查半天都找不到 後來才知道在17雖然已不是undefined behavior 但仍是unspecified behavior 為避免混亂,這兩行不要理它
loveflames: 17有規定函數參數的求值順序03/09 19:22
loveflames: E1.E2應該要算成上面的那個,所以拿掉03/09 20:14
wtchen: 我寫的時候是參照這裡 03/09 23:10
wtchen: 已經把f(++i,++i)拿掉,感謝指正(真是亂到我都搞不懂) 03/09 23:12
loveflames: 除了這個例子沒找到,其他我在規格書都有翻到 03/09 23:28
loveflames: 大多寫在5.2節,而list-initIialization寫在其他地方 03/09 23:29
loveflames: f(i = -1, i = -1)不是從左到右,它合法的原因是 03/09 23:33
loveflames: 進入function前每個argument的副作用會處理完畢 03/09 23:40
wtchen: 不懂,那f(i=-1, i=1)的話,i會是-1還是1? 03/09 23:48
loveflames: unspecified behavior 03/10 00:15
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