为了账号安全,请及时绑定邮箱和手机立即绑定

突然发现自己离了电脑就不知道怎么算,为什么,我在死学吗?

突然发现自己离了电脑就不知道怎么算,为什么,我在死学吗?

#include<stdio.h> int main() { int x=3; int sum=0; sum=(++x)+(++x)+(--x); printf("%d\n",sum); } 这个代码是如何算出14的,求过程。
查看完整描述

3 回答

已采纳
?
onemoo

TA贡献883条经验 获得超454个赞

前面一个回答是有问题的,我在后面的留言中指出了错误所在。


首先说,像 (++x)+(++x)+(--x) 这样连续使用自增减运算符的表达式是有问题的,这代码的行为是未定义的,它得出 10 11 13 ... 什么的都有可能...

具体来说,造成问题的主要原因有两点:

  1. 运算符的操作数的求值顺序是不确定的。

    C标准没有规定运算符操作数的求值顺序,C标准只规定了运算符的运算顺序结合性

    比如表达式 a + b + c * d,根据运算符运算顺序我们可以确定乘法运算符优先于加法运算符,所以 c * d 先算;而加法运算符的结合性是从左到右,所以再算 a + b,随后再加上 c * d 的结果。

    a b c d 这些就叫做运算符的操作数,这几个变量的具体的值是什么时候确定的呢? 这几个操作数的求值顺序是也按照运算顺序来吗?(先确定c和d的值,再确定a和b的值?) 答案是:不确定! 这几个变量的值在运算前确定就可以了,具体是谁先谁后、在哪个时点都有可能。

    也许你会疑惑,a b c d这几个变量的值在这个代码中不是也不会变化吗? 什么时候确定不都一样吗?  也许是,但是不要忘了很多时候操作数不是简单的变量,操作数也可能是其他的表达式或函数调用的返回值,这样操作数求值顺序的变化也许会导致操作数的值也不同(比如你题目中的表达式就是此例,详解见下一条)。

  2. 自增减运算符是有副作用的(自增就是副作用),在你的这个表达式中,这三个副作用的发生时机也不确定!

    这里不明白的话,请看我在老问答区的一个回答 http://www.imooc.com/qadetail/64864  

以上两点结合起来就导致了这个表达是的值也是不确定的!

绝对不要再实践中写C标准中未定义行为的代码!

查看完整回答
1 反对 回复 2017-03-17
  • 3 回答
  • 1 关注
  • 1208 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信