Posted on 2006-11-24 15:31
itspy 阅读(2261)
评论(5) 编辑 收藏 所属分类:
JAVA技术
int a =10; a+=a-=a*=a;
上面的两句,在JAVA与C++中有不一样的表现。它们的结果一个是-80,一个是0。是JAVA中是0,还是C++中是0,你知道吗?
在实验知道结果后,很容易解释。差别在于:右边的=运算完以后,前面的=左边的变量值是否发送了变化 。
但是深层的原因是怎么回事?我反正是不太了解,我是和一要好的同学闲聊时发现这样的问题的,希望有人能比较彻底的讲解一下。
注:修改成a+=(a-=(a*=a));结果也没有变化,可见不关运算顺序,及运算符结合的问题
C++我用的是TruboC++,防止可能不同的编绎器实现不一样照成的争吵。
当然开发中,要是有人写出这样的代码肯定要被人骂.但是从语言的比较来说,或者是出于对语言的细节的学习.上面的代码还是很有意思的.
评论
# re: JAVA与C++的一点比较 回复 更多评论
2006-11-24 20:47 by
在c中是0
在java中是-80
在java中赋值时会创建一个临时变量。
# re: JAVA与C++的一点比较 回复 更多评论
2006-11-24 21:11 by
@anbutu
在java中赋值时会创建一个临时变量。
有更详细点的资料吗?
# re: JAVA与C++的一点比较 回复 更多评论
2006-11-24 23:33 by
java在计算之前,值应该是都付好了
10+=(10-=(10*=10))
# re: JAVA与C++的一点比较 回复 更多评论
2006-11-26 01:29 by
java中对于内置类型的引用总是赋值,对于对象总是传递别名。赋值操作总是包含两个含义,第一,就是分配新的空间。第二,就是把值复制到新空间。就是说其实int a =10; a+=a-=a*=a;两个式子中的a都有自己的空间,并且总是拷贝第一个式子中a的值。但是值得注意的是,当这个式子运算完毕之后,最终会将第二个式子中的a赋给头一个a。坐沙发的那个同志说是第二个式子中的a是临时变量是个不错的理解方式。这属于java语言的实现机制了。
C++中因为可以自己分配指针。所以其实是可以自由定制的。但是你这个写法,两个式子的a是指向了同一个地址的相同引用。在进行运算的时候,a的值本身不断变化。
第一步,a*=a,a的值变成了100,第二步,a-=a*=a, a的值变成了0,第三步,a+=a-=a*=a 实际上就是0 += 0了。不打括号的顺序其实有点不一样的,只不过结果刚好是一样的。一个-80,一个是0。
# re: JAVA与C++的一点比较 回复 更多评论
2006-11-26 10:12 by
@Christ Chang
楼上讲的真详细.谢谢了.