黑马程序员技术交流社区

标题: 比较s+=4;和s=s+4;的不同 [打印本页]

作者: 伯爵公子    时间: 2015-7-18 09:44
标题: 比较s+=4;和s=s+4;的不同
  1. class OperatorDemo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 short s = 3;
  6.                 s += 4;
  7.                 System.out.println("s= "+ s);// s =7
  8.         }
  9. }
复制代码

说明:在执行s+=4;语句时,编译器在编译的时候,默认进行了强制类型转换,也就是将int类型的数据类型转换成short类型的数据。

  1. class OperatorDemo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 short s = 3;
  6.                 s = s + 4;//报错
  7.                 System.out.println("s= "+ s);
  8.         }
  9. }
复制代码

说明:在执行s=s+4;语句时,编译器在进行编译的时候,默认并没有强制类型转换。所以,s是short类型,4是int类型,s会自动提升为int类型,相加的和也是int类型,赋值给short类型的变量肯定会损失精度。报错,可以通过强制类型转换解决问题:s=(short)(s+4);
作者: 小刘123    时间: 2015-7-18 10:16
路过顶一下  分析的不错
作者: ivu    时间: 2015-7-18 10:38
顶一个!!!

作者: 帅帅loyal    时间: 2015-7-18 10:40
顶一个,
作者: 加多宝    时间: 2015-7-18 10:51
精度有关?
作者: 不怕黑人    时间: 2015-7-18 11:17
发现细节问题,向你学习
作者: 野驴少东    时间: 2015-7-18 14:08
short s = 3;
                s += 4;
                System.out.println("s= "+ s);// s =7
short s = 3;
                s += 20000;
                System.out.println("s= "+ s);// s =20003
short s = 3;
                s += 40000;
                System.out.println("s= "+ s);// s =-25533
说明算数运算符+=左边的数据类型为最终数据类型,即使发生溢出。
作者: gaoming971366    时间: 2015-7-18 14:29
恩,这个确实是这样,我看过一个面试就有一个这样,这是个技术问题,顶楼上
作者: Wqi    时间: 2015-7-18 14:38
+=是赋值运算,一次运算,而且会自动匹配范围。     s=s+4这是2次运算,先计算s+4,然后赋值给s,如果s的数据类型不是long或者int就需要强制转换。。
作者: zhwfa1991    时间: 2015-7-18 15:54
顶一个!
作者: 伯爵公子    时间: 2015-7-19 10:23
小刘123 发表于 2015-7-18 10:16
路过顶一下  分析的不错

感谢路过的朋友一下
作者: 伯爵公子    时间: 2015-7-19 10:24
帅帅loyal 发表于 2015-7-18 10:40
顶一个,

谢谢顶一个,你的技术分都够了,你面试了吗?
作者: 伯爵公子    时间: 2015-7-19 10:26
加多宝 发表于 2015-7-18 10:51
精度有关?

是呀,short 和 int 一个16位一个32位。转换的时候有精度问题产生
作者: 伯爵公子    时间: 2015-7-19 10:28
野驴少东 发表于 2015-7-18 14:08
short s = 3;
                s += 4;
                System.out.println("s= "+ s);// s =7

+=是JVM识别的强制类型转换,不过我没验证过溢出,感谢你的验证
作者: 伯爵公子    时间: 2015-7-19 10:29
gaoming971366 发表于 2015-7-18 14:29
恩,这个确实是这样,我看过一个面试就有一个这样,这是个技术问题,顶楼上 ...

希望面试遇到这个问题,哈哈
作者: 伯爵公子    时间: 2015-7-19 10:31
Wqi 发表于 2015-7-18 14:38
+=是赋值运算,一次运算,而且会自动匹配范围。     s=s+4这是2次运算,先计算s+4,然后赋值给s,如果s的数 ...

分析的很清晰,你的日记写到哪一步了?
作者: 懒人不是懒    时间: 2015-7-19 10:32

顶一个!
作者: WilliCicci    时间: 2015-7-19 11:26
顶一个!!
作者: wrnlksblk    时间: 2015-7-19 11:44
Wqi 发表于 2015-7-18 14:38
+=是赋值运算,一次运算,而且会自动匹配范围。     s=s+4这是2次运算,先计算s+4,然后赋值给s,如果s的数 ...

如果类型都是一样的话,那输出结果应该一样吧??
作者: 差不多冬至    时间: 2015-7-19 12:12
+=就是多了一个隐形的强制转换
作者: Wqi    时间: 2015-7-19 13:09
伯爵公子 发表于 2015-7-19 10:31
分析的很清晰,你的日记写到哪一步了?

才写到面向对象。。。。等面向对象这章学完再整理下
作者: 人造番茄    时间: 2015-7-19 18:25
说的很相信 很好
作者: 帅帅loyal    时间: 2015-7-19 20:32
伯爵公子 发表于 2015-7-19 10:24
谢谢顶一个,你的技术分都够了,你面试了吗?

还没有提交自荐信
作者: 强强_U00ts    时间: 2015-7-19 21:13
定一个!!
作者: 陈建民1    时间: 2015-7-19 21:35
+=进行了内部强制转换
作者: 海洋你好    时间: 2015-7-19 22:15
前者有强制转换,后者没有
作者: vinoMVP    时间: 2015-7-19 22:17
分析的不错
作者: vinoMVP    时间: 2015-7-19 22:19
分析的不错
作者: 伯爵公子    时间: 2015-7-20 07:41
差不多冬至 发表于 2015-7-19 12:12
+=就是多了一个隐形的强制转换

是呀,像这样的特例,java里面真不少
作者: 伯爵公子    时间: 2015-7-20 07:43
wrnlksblk 发表于 2015-7-19 11:44
如果类型都是一样的话,那输出结果应该一样吧??

类型一样的话,结果没区别。
作者: 伯爵公子    时间: 2015-7-20 07:44
WilliCicci 发表于 2015-7-19 11:26
顶一个!!

你的技术分也差不多了,进行到哪一步了?




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