Re: C/C++ 語言新手十三誡 -- Ver. 2016

看板C_and_CPP (C/C++)作者 (私は幸せです)時間8年前 (2016/06/09 05:25), 8年前編輯推噓2(204)
留言6則, 1人參與, 最新討論串4/6 (看更多)
※ 引述《wtchen (沒有存在感的人)》之銘言: 問題點 :                        ^^^^^^ : 08. 你不可以在一個運算式(expression)中,對一個基本型態的變數修改其值 : ^^^^^^^^^^^^^^^^^^^^^^^^^^ : 超過一次以上。否則,將導致未定義的行為(undefined behavior) 可以改成:  08. 在一個無順序點 (sequence point) 的表示式 (expression) 中... (略) 原因如下:  int i = 7; int j = (++i, i++); 是合法的,因為順序點保證了執行的順序。 ^^^^^^^^^^ 1 expression ^^^ ^^^ 2 subexpressions separated by 1 sequence point 不過這個好像也是有點太細節了。 此外,逗號運算符 (operator) 可以當作順序點,但是逗號分隔符 (separator) 卻不能, 因此,函數 function(a, b); 並不保證賦值的順序是從左到右,可能是亂序,或是逆序。 所以,把上述的問題放在錯誤例子(最後兩個)有點怪, 因為,會發生錯誤的原因跟一個表示式中修改兩次值無關, 然而,相反的,函數 function 中,a 與 b 是兩個不同的表示式, 只是那兩個表示式之間並沒有順序點來保證 a 與 b 之間執行的順序。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.160.127.22 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1465421123.A.115.html ※ 編輯: Hazukashiine (111.241.157.183), 06/09/2016 10:51:32

06/09 14:43, , 1F
我有想過把這篇重新用順序點的概念重寫,不過怎麼寫都不順
06/09 14:43, 1F

06/09 14:44, , 2F
你確定不是int j = (++i) + (i++); ?
06/09 14:44, 2F
無論如何 加號都不會是順序點 所以 int j = (++i) + (i++); 仍然是未定義行為。

06/09 14:48, , 3F
int j = (++i, i++); 是啥意思?函式嗎?
06/09 14:48, 3F
int i = 7; int j = (++i, i++); // i : 7 → 8 (++i) // j = i (j == 8) // i : 8 → 9 (i++) (i == 9) ※ 編輯: Hazukashiine (111.241.157.183), 06/09/2016 14:58:47

06/09 15:00, , 4F
我得想一下怎麼改,C++11開始是用Sequenced Before/After
06/09 15:00, 4F

06/09 15:01, , 5F
取代sequence point,有沒有不同要再研究一下
06/09 15:01, 5F

06/09 15:01, , 6F
有無C++11的高手可以出來補充一下?
06/09 15:01, 6F
文章代碼(AID): #1NM8r34L (C_and_CPP)
文章代碼(AID): #1NM8r34L (C_and_CPP)