社区
Java SE
帖子详情
s1 += 1和s1 = s1 + 1的区别
zbl0201
2007-10-05 08:23:00
short s1 = 1; s1 = s1 + 1; 有错,s1是short型,s1+1是int型,不能显式转化为short型。
可修改为s1 =(short)(s1 + 1)
但是
short s1 = 1; s1 += 1;为什么是正确的呀?
...全文
905
12
打赏
收藏
s1 += 1和s1 = s1 + 1的区别
short s1 = 1; s1 = s1 + 1; 有错,s1是short型,s1+1是int型,不能显式转化为short型。 可修改为s1 =(short)(s1 + 1) 但是 short s1 = 1; s1 += 1;为什么是正确的呀?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
12 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
我是小辉辉
2007-10-08
打赏
举报
回复
+=为复合赋值表达式.复合赋值表达式自动地将它们所执行的计算的结果转型为其左侧变量
的类型。如果结果的类型与该变量的类型相同,那么这个转型不会造成任何影响。
然而,如果结果的类型比该变量的类型要宽,那么复合赋值操作符将悄悄地执行
一个窄化原始类型转换。
为了说得具体一些,并提供一个解决方案给这个谜题,假设我们在该谜题的两个
赋值表达式之前有下面这些声明:
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 类型。这些规则足以防止编译器产生危险的窄化转型。
总之,复合赋值操作符会悄悄地产生一个转型。如果计算结果的类型宽于变量的
类型,那么所产生的转型就是一个危险的窄化转型。这样的转型可能会悄悄地丢
弃掉精度或数量值。对语言设计者来说,也许让复合赋值操作符产生一个不可见
的转型本身就是一个错误;对于在复合赋值中的变量类型比计算结果窄的情况,
也许应该让其非法才对。
lz1019
2007-10-08
打赏
举报
回复
mark
blh
2007-10-07
打赏
举报
回复
+=符合运算符自身可以进行类型转换
zhangguiwu
2007-10-07
打赏
举报
回复
更加支持6楼
youyiming
2007-10-06
打赏
举报
回复
s1+1得到的结果是int类型的,自然不能赋给short,加一个强制转换就行,如果是s1+=1的话,s1+1的结果隐式转换成s1的类型,在赋给s1,不用显式转换,这就是“操作符=” 的功能。
knight_hf
2007-10-06
打赏
举报
回复
java初学者,觉得楼上说得符合逻辑!
lihaifeng0412
2007-10-06
打赏
举报
回复
s1 = s1 + 1;计算时候是先计算s1+1,把两个类型的数据计算的结果临时存入一个变量中(两个数据类型都不一样,自然不能计算了),然后把这个变量在赋值给s1;
而 s1 += 1是直接隐式转换把s1和1相加(所以没有问题),并没有创建新的变量直接把计算结果赋给s1,这就是s1+=1比s1=s1+1用的时间少;
我是这么理解的不知道对不对,请参考,给点建议!
sinch15
2007-10-06
打赏
举报
回复
支持四楼所说的。。。。。。
supperhpxd
2007-10-05
打赏
举报
回复
在这里java和c++是不一样的
第一种情况中,short型和int型是不能够这样直接相加的,
而第二种情况下+=会自动转换的
应该是java的特性吧,没有太多的为什么吧
如有不对,请指教
zxl_long
2007-10-05
打赏
举报
回复
第二个能够,数据类型自动隐式转换
hailun
2007-10-05
打赏
举报
回复
他的T1类型应该是S1的而不是A的
hailun
2007-10-05
打赏
举报
回复
http://topic.csdn.net/u/20070712/19/199bb5b0-49eb-474d-9387-0c9c0d49fbd8.html
看2楼的回复
Java :
s1
=
s1
+1与
s1
+=1 有何
区别
s1
=
s1
+1与
s1
+=1 有何
区别
简述 单从运算方面,两者没有太大
区别
,达到同样的效果;主要差异可通过以下代码对比说明: 代码一: short
s1
= 1;
s1
=
s1
+ 1; 以上代码,在编译时会出现错误,原因为
s1
+1运算时会自动...
short
s1
= 1;
s1
=
s1
+ 1; 有错吗short
s1
= 1;
s1
+= 1 有错吗
由于 1 是 int 类型,因此
s1
+1 运算结果也是 int 型,需要强制转换类型才能赋值给 short 型。而 short
s1
= 1;
s1
+= 1;可以正确编译,因为
s1
+= 1;相当于
s1
= (short)(
s1
+ 1);其中有隐含的强制类型转换。 ——...
Java中 short
s1
= 1;
s1
=
s1
+ 1;有什么错? short
s1
= 1;
s1
+= 1;有什么错?
(
s1
+1运算结果是int型,需要强制转换类型)
s1
+= 1;(可以正确编译)对于short
s1
= 1;来说,在进行
s1
+ 1运算时会自动提升表达式的类型为int, 那么将int类型赋值给short类型的变量
s1
会出现类型转换错误。对于...
short
s1
= 1;
s1
=
s1
+ 1;有错吗?short
s1
= 1;
s1
+= 1;有错吗?
short
s1
= 1;
s1
=
s1
+ 1;...由于1是int类型,因此
s1
+1运算结果也是int 型,需要强制转换类型才能赋值给short型。而short
s1
= 1;
s1
+= 1;可以正确编译,因为
s1
+= 1;相当于
s1
= (short)(
s1
+ 1);其...
面试题系列之short
s1
= 1;
s1
=
s1
+1 和short
s1
= 1;
s1
+= 1;有什么
区别
s1
=
s1
+1因为1是int类型,而等号左边的
s1
是short类型,由于
s1
+1运算时会自动提升表达式的类型,所以运算的结果是int型,再赋值给 short类型
s1
时,编译器将报告需要强制转换类型的错误,所以需要进行强转。...
Java SE
62,623
社区成员
307,257
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章