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

#include<stdio.h> int main() { int x=3; int sum=0; sum=(++x)+(++x)+(--x); printf("%d\n",sum); } 这个代码是如何算出14的,求过程。
I0123456789101112131415161718192021222324252627282930313233343536373839
浏览 1205回答 3
3回答

onemoo

前面一个回答是有问题的,我在后面的留言中指出了错误所在。首先说,像 (++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标准中未定义行为的代码!
打开App,查看更多内容
随时随地看视频慕课网APP