`
__temp
  • 浏览: 13048 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

深入理解x+=i和x=x+i

阅读更多
先问一个问题
x+=i和x=x+i两个表达式是一样的吗?
很多人都认为二者是一样的,没有什么不同,只是一个是另一个的简写形式罢了,
但是这并是十分准确的,这两个表达式都是赋值表达式,一个简单的”=“赋值表达式,
另一个是复合赋值表达式。
在java中有一种隐式的类型转换,在复合赋值表达式中,自动的将其所执行的计算的结果,转型为其左侧变量的类型。如果结果的类型与该变量的类型相同,那么这个转型不会造成任何影响,但是,如果结果的类型比该变量的类型要宽,那么复合赋值操作将隐式的执行窄化操作的类型转换,所以上述两个表达式可能会造成编译错误。
例如:
  short x=0; int i=123456;
  x+=x+i;//不会产生任何的编译错误,但是包含了一个隐式的类型转换。
您可能会说执行的结果是123456,但是并非如此,它的值是-7616,int的类型对于short太大了,要进行窄化操作,截取后四位,所以结果并不是你所想。
相对应的,简单复制是非法的,因为它视图将int数值赋值给short变量,他需要一个显示的类型转换
x=x+i//会造成编译错误
所以,复合赋值表达式是很危险的,为了避免这种错误,不要讲复合赋值操作符用于byte,short,char类型的变量上,在用于int时,要保证右侧表达式不是long,float,double,复合赋值用于float时,保证右侧不是double,防止编译器窄化。

具体关于窄化与放大隐式转化的问题可以查看java编程思想一书,非常详细!

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics