Re: [問題] ++ 與陣列的問題

看板C_and_CPP (C/C++)作者 (咕啾咕啾魔法陣)時間9年前 (2017/03/08 21:28), 9年前編輯推噓10(10022)
留言32則, 12人參與, 最新討論串2/2 (看更多)
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

03/08 21:30, , 1F
下次老師就會加註:「請用C++17規則作答」
03/08 21:30, 1F

03/08 21:34, , 2F
感謝大大
03/08 21:34, 2F

03/08 22:10, , 3F
過度重視求值順序跟運算子優先順序,我覺得害處很大
03/08 22:10, 3F

03/08 22:10, , 4F
別人看到這種code還得去查表
03/08 22:10, 4F

03/08 22:36, , 5F
為什麼 c++17 要定這個標準?
03/08 22:36, 5F

03/08 22:49, , 6F
因為有人發現,unspecified behavior會變成
03/08 22:49, 6F

03/08 22:49, , 7F
undefined behavior
03/08 22:49, 7F

03/08 22:50, , 8F
讀p0145r3就可以知道原因了
03/08 22:50, 8F

03/08 23:29, , 9F
沒有明確的定義,有帶來任何好處嗎?
03/08 23:29, 9F

03/08 23:44, , 10F
感謝,已補充進13誡(覺得C++愈來愈龜毛)
03/08 23:44, 10F

03/08 23:50, , 11F
為啥到c++17才規定...
03/08 23:50, 11F

03/09 00:03, , 12F
有規範是好事啦, 除非要讓它 syntax error 不然就是個雷
03/09 00:03, 12F

03/09 00:03, , 13F
有規則的雷總比沒規則的雷要好
03/09 00:03, 13F

03/09 00:08, , 14F
不要過度使用就是
03/09 00:08, 14F

03/09 05:02, , 15F
不明確定義,方便compiler自由發揮。
03/09 05:02, 15F
補充一個比較複雜的例子 //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

03/09 17:44, , 16F
這樣寫code有比較清楚嗎?定義這個感覺吃飽太閒
03/09 17:44, 16F

03/09 17:52, , 17F
定義是需要啦,不要濫用就好
03/09 17:52, 17F

03/09 18:14, , 18F
C++17真的閒到去定義這個?
03/09 18:14, 18F

03/09 18:27, , 19F
我這篇寫的都有定義
03/09 18:27, 19F

03/09 19:02, , 20F
E1(E2,E3)這裡的E2,E3應該沒規定順序?
03/09 19:02, 20F
我得更正前面的結論 看到置底十三誡的f(++i,++i),沒查來源就直接套了 查規格書查半天都找不到 後來才知道在17雖然已不是undefined behavior 但仍是unspecified behavior 為避免混亂,這兩行不要理它

03/09 19:22, , 21F
17有規定函數參數的求值順序
03/09 19:22, 21F

03/09 20:14, , 22F
E1.E2應該要算成上面的那個,所以拿掉
03/09 20:14, 22F

03/09 23:10, , 23F
我寫的時候是參照這裡
03/09 23:10, 23F

03/09 23:12, , 25F
已經把f(++i,++i)拿掉,感謝指正(真是亂到我都搞不懂)
03/09 23:12, 25F

03/09 23:28, , 26F
除了這個例子沒找到,其他我在規格書都有翻到
03/09 23:28, 26F

03/09 23:29, , 27F
大多寫在5.2節,而list-initIialization寫在其他地方
03/09 23:29, 27F

03/09 23:33, , 28F
f(i = -1, i = -1)不是從左到右,它合法的原因是
03/09 23:33, 28F

03/09 23:40, , 29F
進入function前每個argument的副作用會處理完畢
03/09 23:40, 29F

03/09 23:48, , 30F
不懂,那f(i=-1, i=1)的話,i會是-1還是1?
03/09 23:48, 30F

03/10 00:15, , 31F
unspecified behavior
03/10 00:15, 31F

03/10 00:18, , 32F
左右方向隨編譯器定的
03/10 00:18, 32F
想到一個好例子,這個有查過規格書可以掛保證 T x(E1,E2); //unspecified T x{E1,E2}; //E1 -> E2 ※ 編輯: loveflames (36.237.103.169), 03/10/2017 10:15:38
文章代碼(AID): #1Om0S2S5 (C_and_CPP)
文章代碼(AID): #1Om0S2S5 (C_and_CPP)