Java 面试题 short s = 1; s = s + 1; 与 s += 1; 背后的秘密

本文讨论了Java中short类型变量与常量相加后再赋值的问题,解释了为什么`s = s + 1`无法通过编译而`s += 1`可以。分析了运算符优先级、类型转换机制,并通过字节码反编译展示了两种表达式的本质等价性。
摘要由CSDN通过智能技术生成

案例一:

short s = 1; 

s = s + 1;

上述代码能否通过编译,为什么?

 

案例二:

short s = 1;

s += 1;

上述代码能否通过编译,为什么?


以上两个问题是非常经典的一道Java面试题,面试中出现的频率在70%以上。答案可能大家都非常清楚了,案例一可以不能通过编译,案例二可以,那么这又是为什么呢?

答案要从运算符的优先级、运算机制、默认数据类型和类型转换的机制中来寻找。

首先,我们来分析“ s = s + 1; ”。在这个表达式中,涉及到了加法(+)和赋值(=)两种运算。加法运算的优先级高于赋值运算,因此会先编译加法运算。在这个过程中,加号左侧为 short 类型的变量 s,右侧为常量值 1,1的默认数据类型为 int 类型,这种情况下,s 会自动类型提升,隐式转换为 int 类型。这个过程结束之后,会继续对赋值运算进行编译。此时,等号左侧为 short 类型变量 s,等号右侧为 int 类型变量,要把 int 类型变量的值赋给 short 类型变量,由于 int 类型的数据宽长为 32 位,short 类型的数据长度为16位,而变量的值在编译期间是无法确定的,所以编译器会认为在这个赋值过程中会发生数据信息丢失,从而编译不能通过。

我们再来看一些情况:

byte a = 3;      // 编译正确

byte b = 1000;   // 编译出错 Type mismatch: cannot convert from int to byte

float c = .7;   // 编译出错 Type mismatch: cannot convert from double to float

在这个例子中,我们会有这样的疑问,同样是由 int 类型常量赋给 byte 类型变量

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值