作者Hazukashiine (私は幸せです)
看板C_and_CPP
标题Re: C/C++ 语言新手十三诫 -- Ver. 2016
时间Thu Jun 9 05:25:19 2016
※ 引述《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://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1465421123.A.115.html
※ 编辑: Hazukashiine (111.241.157.183), 06/09/2016 10:51:32
1F:推 wtchen: 我有想过把这篇重新用顺序点的概念重写,不过怎麽写都不顺 06/09 14:43
2F:→ wtchen: 你确定不是int j = (++i) + (i++); ? 06/09 14:44
无论如何 加号都不会是顺序点 所以 int j = (++i) + (i++); 仍然是未定义行为。
3F:→ wtchen: int j = (++i, i++); 是啥意思?函式吗? 06/09 14:48
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
4F:推 wtchen: 我得想一下怎麽改,C++11开始是用Sequenced Before/After 06/09 15:00
5F:→ wtchen: 取代sequence point,有没有不同要再研究一下 06/09 15:01
6F:→ wtchen: 有无C++11的高手可以出来补充一下? 06/09 15:01