posts - 82, comments - 269, trackbacks - 0, articles - 1
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

JAVA与C++的一点比较

Posted on 2006-11-24 15:31 itspy 阅读(2135) 评论(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 anbutu
在c中是0
在java中是-80

在java中赋值时会创建一个临时变量。

# re: JAVA与C++的一点比较  回复  更多评论   

2006-11-24 21:11 by itspy
@anbutu
在java中赋值时会创建一个临时变量。

有更详细点的资料吗?

# re: JAVA与C++的一点比较  回复  更多评论   

2006-11-24 23:33 by ronghai
java在计算之前,值应该是都付好了
10+=(10-=(10*=10))

# re: JAVA与C++的一点比较  回复  更多评论   

2006-11-26 01:29 by Christ Chang
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 itspy
@Christ Chang
楼上讲的真详细.谢谢了.

只有注册用户登录后才能发表评论。


网站导航: