【Java面试题】57 short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?

Java规范有这样的规则:

  1. 高位转低位需要强制转换
  2. 低位转高位自动转.
short s1 = 1;
s1 = s1 + 1;  有什么错?

short s2 = 1;
s2 += 1;

short s1 = 1; s1 = s1 + 1;有什么错?
s1是short型,1是short型,通过+运算符,计算的时候s1转换为int型,最后把s1+1赋值给s1的时候,s1是short型,所以出错。
short s1 = 1; s1 += 1;有什么错?
如果你认为表达式x+=i只是表达式x=x+i的简写方式,这并不准确。
这两个表达式都被称为赋值表达式。x=x+i表达式使用的是简单赋值操作符=,而x+=i表达式使用的是复合赋值操作符。Java语言规范中讲到,复合赋值E1 op =E2等价于简单赋值(E1=(T)((E1) op (E2))),其中T是E1的类型,除非E1只被计算一次。换句话说,复合赋值表达式自动地将所执行计算的结果转型为其左侧变量的类型。如果结果的类型与该变量的类型相同,那么这个转型不会造成任何影响。然而,如果结果的类型比该变量的类型要宽,那么复合赋值操作符将悄悄地执行一个窄化原生类型转换。
因此,复合赋值表达式可能是危险的。为了避免这种令人不快的突袭,请不要将复合赋值操作符作用于byte、short或char类型的变量。 因为s1是short型的,占2个字节,而1是int型的,占4个字节。在两个类型的值相加的时候,会发生自动类型的提升,也就是说s1+1后,其结果是int型的,而不是short型的,所以可以想想看,把4个字节的东西放在两个字节的空间里,肯定编译不通过。

后面的那个不会发生类型的提升,JAVA规范上说e1+=e2实际上是e1=(T1)(e1+e2) ,其中T1是e1的数据类型。 s1+=1等效于s1=(short)(s1+1),所以是正确的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? java虚拟机是一个可以执行java字节...
    晨星资源阅读 554评论 0 3
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,785评论 18 399
  • 转自:http://blog.csdn.net/jackfrued/article/details/4492194...
    王帅199207阅读 8,628评论 3 93
  • 集合框架: 1)特点:存储对象;长度可变;存储对象的类型可不同2)Collection(1)List:有序的;元素...
    Demo_Yang阅读 1,300评论 0 4
  • 一、Java基础部分 1、面向对象的特征有哪些方面? a.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以...
    huststl阅读 391评论 0 1