'i = i + 1"与"i += 1"有什么区别?

昭义九州 2008-11-11 07:24:20
short i = 1;
i = i + 1;//错误
i += 1;//正确
我知道第一个是之所以错误是因为1默认为int类型的在与short类型的i相加的后类型转换为int型的,将int型值赋值给short类型的i是不正确的。
那么第二个为什么正确呢?不是i += 1等价与i = i + 1的吗?
...全文
287 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
昭义九州 2008-11-12
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 lc7cl 的回复:]
许多程序员都会认为该迷题中的第一个表达式(x += i)只是第二个表达式(x =
x + i)的简写方式。但是这并不十分准确。这两个表达式都被称为赋值表达式。
第二条语句使用的是简单赋值操作符(=),而第一条语句使用的是复合赋值操
作符。(复合赋值操作符包括 +=、-=、*=、/=、%=、 < <=、>>=、>>>=、&=、^=
和|=)Java 语言规范中讲到,复合赋值 E1 op= E2 等价于简单赋值E1 =
(T)((E1)op(E2)),其中T 是E1 的类型,除非E1…
[/Quote]
终于出来最终解释了,解释的够明白,多谢了。
lc7cl 2008-11-12
  • 打赏
  • 举报
回复
《Java解惑》里“谜题9:半斤”,我给粘出来。
lc7cl 2008-11-12
  • 打赏
  • 举报
回复
许多程序员都会认为该迷题中的第一个表达式(x += i)只是第二个表达式(x =
x + i)的简写方式。但是这并不十分准确。这两个表达式都被称为赋值表达式。
第二条语句使用的是简单赋值操作符(=),而第一条语句使用的是复合赋值操
作符。(复合赋值操作符包括 +=、-=、*=、/=、%=、<<=、>>=、>>>=、&=、^=
和|=)Java 语言规范中讲到,复合赋值 E1 op= E2 等价于简单赋值E1 =
(T)((E1)op(E2)),其中T 是E1 的类型,除非E1 只被计算一次。
换句话说,复合赋值表达式自动地将它们所执行的计算的结果转型为其左侧变量
的类型。如果结果的类型与该变量的类型相同,那么这个转型不会造成任何影响。
然而,如果结果的类型比该变量的类型要宽,那么复合赋值操作符将悄悄地执行
一个窄化原始类型转换。因此,我们有很好的理由去解释为什么在尝试着执行等
价的简单赋值可能会产生一个编译错误。
为了说得具体一些,并提供一个解决方案给这个谜题,假设我们在该谜题的两个
赋值表达式之前有下面这些声明:
short x = 0;
int i = 123456;
复合赋值编译将不会产生任何错误:
x += i; // 包含了一个隐藏的转型!
你可能期望x 的值在这条语句执行之后是123,456,但是并非如此l,它的值是
-7,616。int 类型的数值123456 对于short 来说太大了。自动产生的转型悄悄
地把int 数值的高两位给截掉了。这也许就不是你想要的了。
相对应的简单赋值是非法的,因为它试图将int 数值赋值给short 变量,它需要
一个显式的转型:
x = x + i; // 不要编译——“可能会丢掉精度”
这应该是明显的,复合赋值表达式可能是很危险的。为了避免这种令人不快的突
袭,请不要将复合赋值操作符作用于byte、short 或char 类型的变量上。在将
复合赋值操作符作用于int类型的变量上时,要确保表达式右侧不是long、float
或double 类型。在将复合赋值操作符作用于float 类型的变量上时,要确保表
达式右侧不是double 类型。这些规则足以防止编译器产生危险的窄化转型。
总之,复合赋值操作符会悄悄地产生一个转型。如果计算结果的类型宽于变量的
类型,那么所产生的转型就是一个危险的窄化转型。这样的转型可能会悄悄地丢
弃掉精度或数量值。对语言设计者来说,也许让复合赋值操作符产生一个不可见
的转型本身就是一个错误;对于在复合赋值中的变量类型比计算结果窄的情况,
也许应该让其非法才对。
sunnylyy 2008-11-12
  • 打赏
  • 举报
回复
有一本书《java解惑》,上边有详细的说明。
昭义九州 2008-11-12
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 aa278489710 的回复:]
分析可以得出short i=i+1时,右边的是一个short类型的加上一个整型的1,结果右边的short类型i就转换成整型,而等号左边的类型为short类型,所以就会在编译的时候发生强制转换错误;而short i+=1时是先将"+= "右边的类型强制转换成左边的类型后再进行运算的,所以不会出现强制转换错误.
如果LZ还不能理解的话,可以去我的博客看http://blog.csdn.net/aa278489710/archive/2008/11/02/3206552.aspx
[/Quote]

去看过了,你的解释是先把int类型的1转换成short类型的1然后再与i相加,不过还有另一种解释是i += 1;等价于 i = ( short )( i + 1 );即先把i加1然后对结果强制类型转换,到底那个对啊?
moshangchenzi 2008-11-11
  • 打赏
  • 举报
回复
i = i + 1;//错误
右边 i + 1的结果是int型的,左边i是short型的,需要强制转换。
i += 1;//正确
先把i转换成int再执行+1的运算。
两者的运算顺序不同。
fskjb01 2008-11-11
  • 打赏
  • 举报
回复
可以这样理解吧=和+=都是一个赋值符,没有经过数值运算!
所以
short i=1;
short i +=1;
都是对的
echoabs 2008-11-11
  • 打赏
  • 举报
回复
分析可以得出short i=i+1时,右边的是一个short类型的加上一个整型的1,结果右边的short类型i就转换成整型,而等号左边的类型为short类型,所以就会在编译的时候发生强制转换错误;而short i+=1时是先将"+= "右边的类型强制转换成左边的类型后再进行运算的,所以不会出现强制转换错误.
如果LZ还不能理解的话,可以去我的博客看http://blog.csdn.net/aa278489710/archive/2008/11/02/3206552.aspx
javatotheworld 2008-11-11
  • 打赏
  • 举报
回复
不清楚。。等人解释
轻剑 2008-11-11
  • 打赏
  • 举报
回复
等……
badlove3 2008-11-11
  • 打赏
  • 举报
回复
而二元操作符 不改变操作元的值 而是返回可以返回其他变量的值
badlove3 2008-11-11
  • 打赏
  • 举报
回复
只知道第2个叫2元操作符

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧