A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 236gswqt 中级黑马   /  2014-7-5 15:50  /  1327 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为什么   short s1 = 1;  s1 = s1 + 1;编译出错,


short s1 = 1; s1+=1;却可以正常编译?

6 个回复

倒序浏览
short类型参与运算自动转换成int 类型  所以s1 = s1 + 1应该强制类型转换 s1 =(short) s1 + 1 。 而s1 +=1 就不需要强制转换!
回复 使用道具 举报
郑众杰 发表于 2014-7-5 16:19
short类型参与运算自动转换成int 类型  所以s1 = s1 + 1应该强制类型转换 s1 =(short) s1 + 1 。 而s1 += ...

   thank you  开始还以为一样呢
回复 使用道具 举报
s1 = s1 + 1;   虚拟机会理解成一个String型加上一个int型赋值给s1,不同类型没法相加,String和int也没法自己转换类型
回复 使用道具 举报
对于short s1 = 1; s1 = s1 + 1; 由于s1+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s1时,编译器将报告需要强制转换类型的错误。
对于short s1 = 1; s1 += 1;由于 += 是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。
回复 使用道具 举报
本帖最后由 OCTSJimmy 于 2014-7-5 18:43 编辑

通俗的将:假设,short是个2两碗,int是个4两的碗。首先声明short类型的变量s1,并赋值1,这并没有错。然而实际上,这个1也是int型的,但是这个赋值,会有个自动转换类型的过程。接着运算 s1 = s1 + 1,那么问题出现了,运算时,假如符号两侧的类型不同,将会自动提升类型,以便于不遗失精度。那么这句话中,s1是short型,数字1却是int型的,那么,编译器就自动的把s1中的值的类型强制提升为int型后,与1做运算,运算后的结果,则是提升类型后的结果,也就是这个结果是4两的碗,重赋值给2两的碗,自然报错:将会损失精度。


那么种情况:
s1 += 1 这个+=符号其实是一个符号——赋值符号。虽然再赋值前的求和中,类型被强制提升了,但是会像前面说的“首先”的情况,自动转换类型,当然,这是编译器自动完成的。

自动转换的前提条件:
满足特殊情况,何为特殊情况:
1、赋值运算或 ++ -- 运算
2、在byte、int、short、char四种类型发生。
3、假如是赋值运算,赋值符号“=”的右边为常量,且取值范围在符号左边的类型中。
回复 使用道具 举报
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马