《Java解惑》系列——01表达式之谜——谜题09:半斤

知识点:

复合赋值操作符会悄悄地产生一个转型。

Java语言规范中讲到,复合赋值 E1 op= E2 等价于简单赋值E1 = (T)((E1)op(E2)),

其中 T 是E1 的类型,除非E1 只被计算一次。 


问题:

short x = 0;
int i = 123456;

x += i;// 包含了一个隐藏的转型。语句合法,但是逻辑上有问题

x = x + i; // 语法错误。无法通过编译,丢失精度

结果是不是出乎大家的意料呢?的确如此。
产生这个结果的原因:

Java语言规范中讲到,复合赋值 E1 op= E2 等价于简单赋值E1 = (T)((E1)op(E2)),

其中 T 是E1 的类型,除非E1 只被计算一次。 


解决方法:


总结:

总之,复合赋值操作符会悄悄地产生一个转型。如果计算结果的类型宽于变量的
类型,那么所产生的转型就是一个危险的窄化转型。这样的转型可能会悄悄地丢
弃掉精度或数量值。对语言设计者来说,也许让复合赋值操作符产生一个不可见
的转型本身就是一个错误;对于在复合赋值中的变量类型比计算结果窄的情况,
也许应该让其非法才对。
 




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值