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

作者: Hazukashiine (私は幸せです)   2016-06-09 05:25:19
※ 引述《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 之間執行的順序。
作者: wtchen (沒有存在感的人)   2016-06-09 14:43:00
我有想過把這篇重新用順序點的概念重寫,不過怎麼寫都不順你確定不是int j = (++i) + (i++); ?int j = (++i, i++); 是啥意思?函式嗎?我得想一下怎麼改,C++11開始是用Sequenced Before/After取代sequence point,有沒有不同要再研究一下有無C++11的高手可以出來補充一下?

Links booklink

Contact Us: admin [ a t ] ucptt.com