因为上学很久没写博客了,这几天学校考试,C语言中遇到一道题,伪代码如下:
int x;
x=6;
问x+=x-=x*x的答案,
一开始我觉得挺简单的,后来越想越不对劲,然后干脆运行一下,结果发现很复杂。
java对上述结果运算是-24,C却是-60。
然后查阅资料才把事情搞明白。
公布原因
主要原因:java有个中间变量缓存的机制。
原因探究:首先来看看java和C对a++和++a的解释,这些都一样,a++是先运算后再给a+1,而++a是先给a+1再让他运算。
那么问题出在那里呢?经过多次思考和查阅资料,我认为是这样的,先看如下代码:
运行结果如下
结果发现a++和a=a++完全是两码事,java的中间变量缓存机制对此的解释是:
在java中对变量执行自增自加算术时,会先给变量创建一个同类型的temp,将变量的值先赋给temp,然后让temp去参与运算,最后返回temp,值得注意的是a++是先temp=a,然后temp=temp+1;而++a是先a=a+1,再temp=a。这样就解释了为什么同样的运算在java和C中会有两个不同的结果。
最后总结一下
虽然以上代码可能对a++和++a的阐释不全面,但大概就这个意思。在最上方的算术x+=x-=x*x中,x在运算时始终保持着6这个值,因为参与运算过程的是temp,相当于:temp=x=6,x=temp+temp-temp*temp;而C中相当于这样:x=6,x=x-x*x,x=x+x。x的值从6变成-30,然后变成-60。这就是java和C运算时的差别。