3 回答
TA贡献883条经验 获得超454个赞
前面一个回答是有问题的,我在后面的留言中指出了错误所在。
首先说,像 (++x)+(++x)+(--x) 这样连续使用自增减运算符的表达式是有问题的,这代码的行为是未定义的,它得出 10 11 13 ... 什么的都有可能...
具体来说,造成问题的主要原因有两点:
运算符的操作数的求值顺序是不确定的。
C标准没有规定运算符操作数的求值顺序,C标准只规定了运算符的运算顺序和结合性。
比如表达式 a + b + c * d,根据运算符运算顺序我们可以确定乘法运算符优先于加法运算符,所以 c * d 先算;而加法运算符的结合性是从左到右,所以再算 a + b,随后再加上 c * d 的结果。
a b c d 这些就叫做运算符的操作数,这几个变量的具体的值是什么时候确定的呢? 这几个操作数的求值顺序是也按照运算顺序来吗?(先确定c和d的值,再确定a和b的值?) 答案是:不确定! 这几个变量的值在运算前确定就可以了,具体是谁先谁后、在哪个时点都有可能。
也许你会疑惑,a b c d这几个变量的值在这个代码中不是也不会变化吗? 什么时候确定不都一样吗? 也许是,但是不要忘了很多时候操作数不是简单的变量,操作数也可能是其他的表达式或函数调用的返回值,这样操作数求值顺序的变化也许会导致操作数的值也不同(比如你题目中的表达式就是此例,详解见下一条)。
自增减运算符是有副作用的(自增就是副作用),在你的这个表达式中,这三个副作用的发生时机也不确定!
这里不明白的话,请看我在老问答区的一个回答 http://www.imooc.com/qadetail/64864
以上两点结合起来就导致了这个表达是的值也是不确定的!
绝对不要再实践中写C标准中未定义行为的代码!
- 3 回答
- 1 关注
- 1208 浏览
添加回答
举报