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