黑马程序员技术交流社区
标题:
问个小问题
[打印本页]
作者:
236gswqt
时间:
2014-7-5 15:50
标题:
问个小问题
为什么 short s1 = 1; s1 = s1 + 1;编译出错,
而
short s1 = 1; s1+=1;却可以正常编译?
作者:
郑众杰
时间:
2014-7-5 16:19
short类型参与运算自动转换成int 类型 所以s1 = s1 + 1应该强制类型转换 s1 =(short) s1 + 1 。 而s1 +=1 就不需要强制转换!
作者:
236gswqt
时间:
2014-7-5 16:22
郑众杰 发表于 2014-7-5 16:19
short类型参与运算自动转换成int 类型 所以s1 = s1 + 1应该强制类型转换 s1 =(short) s1 + 1 。 而s1 += ...
thank you 开始还以为一样呢
作者:
霜林醉zhx
时间:
2014-7-5 17:48
s1 = s1 + 1; 虚拟机会理解成一个String型加上一个int型赋值给s1,不同类型没法相加,String和int也没法自己转换类型
作者:
Adjin
时间:
2014-7-5 18:19
对于short s1 = 1; s1 = s1 + 1; 由于s1+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s1时,编译器将报告需要强制转换类型的错误。
对于short s1 = 1; s1 += 1;由于 += 是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。
作者:
OCTSJimmy
时间:
2014-7-5 18:31
本帖最后由 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、假如是赋值运算,赋值符号“=”的右边为
常量
,且取值范围在符号左边的类型中。
作者:
fantacyleo
时间:
2014-7-5 18:36
看这里
http://bbs.itheima.com/thread-127149-1-1.html
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2