黑马程序员技术交流社区

标题: 求指教,求解答! [打印本页]

作者: 黑马-郑玉元    时间: 2013-3-4 14:41
标题: 求指教,求解答!
本帖最后由 黑马-郑玉元 于 2013-3-13 09:55 编辑

定义一个short s = 3;s=s+3与s+=3的区别,我想知道这两个式子在内存中是如何运行的,当然前一个式子是会报错的。
谁能画画它们在内存中是如何运行的?越详细越好。

作者: 张子凯    时间: 2013-3-4 14:47
我感觉两种计算方式一样吧。。。。坐等大神。。
作者: lzw123451    时间: 2013-3-4 14:58
我在网上找了这篇东西,看看对你有没有帮助

x=x+1,x+=1,x++的区别
x=x+1 最低,因为它的执行过程如下:

读取右边变量 x 的内存地址;
执行 x+1;
读取左边变量 x 的内存地址;
将右边的值传给左边的变量 x(编译器并不认为左右两边的变量 x 的内存地址相同)。
首先寻找右面x的地址,然后读取地址中x的值,再在寄存器中将x的值加1,接着寻找左面x的地址(计算机是不知道左面的x就是右面的x的),再讲刚计算的结果存到左面的x的地址中。

x+=1 其次,它的执行过程如下:

读取右边变量 x 的内存地址;
执行 x=1;
将得到的值传给变量 x (因为变量 x 的内存地址已经读出)。
寻找x的地址,然后读取地址中x的值,再在寄存器中将x的值加1,接着将计算结果存到x的地址中(这里计算机知道读与写两个操作的地址是相同的)。

x++ 最高,它的执行如下:

读取右边变量 x 的内存地址;
变量 x 自增1。
寻找x的地址,然后读取地址中x的值,然后直接将地址中的值加1。

从上面的过程可以看出,x++比x+=1少了一个写的过程,而x+=1比x=x+1少了一个寻址的过程(查找左面x的地址),所以三条语句的效率是x = x + 1 < x += 1 < x++ 。
作者: 黑马-郑玉元    时间: 2013-3-4 14:59
张子凯 发表于 2013-3-4 14:47
我感觉两种计算方式一样吧。。。。坐等大神。。

你可以试一试!有一个编译不能通过的!
作者: 黑马-郑玉元    时间: 2013-3-4 15:07
李志卫 发表于 2013-3-4 14:58
我在网上找了这篇东西,看看对你有没有帮助

x=x+1,x+=1,x++的区别

谢谢!上面的内容确实很丰富,也值得我们去认真看看学习学习理解理解!
作者: 袁术森    时间: 2013-3-4 15:35
因为+=是赋值运算符,所以会有类型自动提升动作。而x=x+2;中=右边有变量x,可能会有精度损失。如果x是int型则会编译通过。你可以看看这个链接http://msdn.microsoft.com/zh-cn/library/f6z5yhhs(v=vs.80).aspx
至于内存中运行的有何不同 ,我只知道 在栈内存的main函数空间中 也会有变量内存的划分。
作者: 移动小坦克    时间: 2013-3-4 15:45
s=s+3,错误是因为:
java编译器认为一个像“3”这样的直接数是一个int型。Java的自动类型转换是一个占用空间少的类型可以自动转换成占用空间大的类型,反之则必须强制类型转换,否则报错。“s + 3”这个表达式因为是short型和int型相加,因此short自动转换成了int型,此时再用“s = s + 3”赋值给一个short型而没有强制类型转换那么自然报错。
s+=3;没有错误是因为:
s+=3 相当于 s= (short) s+3;
那么为什么自动就将得到的结果 强制转换了呢? 根据楼上的答案,我的推测是。
s = s+3;编译器是不知道,两个s是同一个变量,运算顺序是先拿到右面s的地址,获取值,并运算,再拿到左面s的地址,通过=运算,被赋值。
s+=3;编译器运算之前就知道,运算结果将赋给short型,因为编译器知道,参与运算的s,和最终被赋值的s是同一个s,在运算时知道了,s是short型,所以会强制转换成int型,但是既然编译器知道最终将赋值给short型,所以它很体贴的又把int的结果自动转换成short型,并赋值
作者: 黑马-郑玉元    时间: 2013-3-4 16:48
袁术森 发表于 2013-3-4 15:35
因为+=是赋值运算符,所以会有类型自动提升动作。而x=x+2;中=右边有变量x,可能会有精度损失。如果x是int ...

我想知道它们在内存是怎么运行的!
作者: 黑马-郑玉元    时间: 2013-3-4 16:50
韩松范 发表于 2013-3-4 15:45
s=s+3,错误是因为:
java编译器认为一个像“3”这样的直接数是一个int型。Java的自动类型转换是一个占用空 ...

3q!!!!!!
作者: 贾文泽    时间: 2013-3-4 16:57
s=s+3与s+=3都是复制操作
s=s+3 是符合赋值操作,  s+=3 是简单赋值操作
java语言规范中,符合赋值 E1 op = E2 等价于简单赋值 E1 = (T)((E1)op(E2)), 其中T是E1的类型,除非E1只被计算了一次
作者: 黑马-郑玉元    时间: 2013-3-4 20:11
贾文泽 发表于 2013-3-4 16:57
s=s+3与s+=3都是复制操作
s=s+3 是符合赋值操作,  s+=3 是简单赋值操作
java语言规范中,符合赋值 E1 op = ...

基本上是懂了!!!!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2