黑马程序员技术交流社区

标题: short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? [打印本页]

作者: 风云1989    时间: 2016-12-3 15:12
标题: short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
1:short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?一:首先要了解java中的数据类型转换知识:
        数据类型转换有两种方式:
            1.自动转型:小类型转成成大类型  (大小类型是指可表示的数据范围)
                     要满足两个条件:a.转换前的数据类型与转换后的数据类型兼容
                                               b.转换后的数据类型的表示范围比转换前的类型大。
                  
            2.强制转型: 大类型转换成小类型
                       转换语法:(要转换的类型)变量名称;
二:题目分析:
1.    shotrt s1=1; s1=s1+1;
     s1是short 类型  1 是int类型  当他们做运算的时候 s1为自动转型为int 类型
     所以 s1+1的结果是 int 类型   ,当要把 大的类型的值赋给小的类型 必须强转
     正确的表达式: s1=(short) (s1+1);  所以本题有错!
2. 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),所以是正确的。     

如果哪有理解和书写错误,有劳各帅哥美女们指点下?不胜感激!




                          




作者: lc0356    时间: 2016-12-3 15:32
好文,顶一个。
作者: 风云1989    时间: 2016-12-3 15:45
lc0356 发表于 2016-12-3 15:32
好文,顶一个。

谢谢,一起学习!!!
作者: maogela    时间: 2016-12-4 01:28
没错!

作者: zch_hadoop    时间: 2016-12-4 20:20
不错不错




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2