黑马程序员技术交流社区

标题: short s1 = 1;s1 = s1 +1;与short s1 = 1; s1+=1;有什么区别 [打印本页]

作者: 阳丹    时间: 2013-6-6 23:54
标题: short s1 = 1;s1 = s1 +1;与short s1 = 1; s1+=1;有什么区别
本帖最后由 阳丹 于 2013-6-7 22:42 编辑

short s1 = 1;s1 = s1 +1;与short s1 = 1; s1+=1;有什么区别
第一种方式不能通过编译 但是第二种可以  想不通是为什么  求指点
作者: a464538715    时间: 2013-6-6 23:57
第一种不能自动提升类型 第二种可以
作者: 李征    时间: 2013-6-7 00:05
因为第一种里,1被默认是int类型,而你定义的变量是短整型,2种不同类型相加,如果想顺利通过编译,需要使用强类型转换,如(short);
而第二种里,是“+=”,这个被JAVA重新封装过的连接符会自动进行类型转换,所以不需要你手动完成,自动通过编译。
作者: 张歆明    时间: 2013-6-7 00:19
s1 = s1 +1  s1为short 1是整型常量 默认是int类型的常量  不同的类型运算 都往精度高的转换 这里面一个为short 一个为int  所以  s1 +1的结果就是int  但是 int赋值给左边的short变量  出现精度损失  就会编译出错  所以。。  第二种 Java对+=做了内部的封装  运算的过程还是和 s1+1一样 但是  运算玩之后  Java会自动帮你把本来是int类型的结果强转为short  不用你来做 这样 就编译通过啦  记住就行了
作者: 王林涛    时间: 2013-6-7 00:32
short s1 = 1;s1 = s1 +1;//这句话错的原因是,你不能把数据类型为int型的赋值给short型啊,这样会丢失精度
short s1 = 1; s1+=1;//而这句话里面+=这样的符号内容强制转换类型在里面,自动类型提升了,就会把short型默认转换为int型
作者: hx32    时间: 2013-6-7 09:39
关于这一个问题,视频中有讲解啊
作者: 孔雀东南飞    时间: 2013-6-7 18:18
受教了,原来是这样,我原来以为是一回事呢。感谢楼主与诸位回答的哥们。
作者: 尹丽峰    时间: 2013-6-7 18:27
问题是否解决?解决请该为【已解决】
作者: 王瀛    时间: 2013-6-7 19:43
第二个 +=的 可以 自动转型

第一个需要强制转型 (short)
作者: peerless2012    时间: 2013-6-7 20:19
第一个例子中加的1是默认类型的,也就是int型的,int型的跟short型的相加会把short型的s1提升到int型,相加之后为int型。然后再给s1赋新值,是从int型转变成short型,会存在丢失精度
int 00000000 00000000 00000000 00000001
s1 (00000000 00000000 00000000 自动类型提升到int型) 00000001
得到结果是
00000000 00000000 00000000 00000011
赋值之后
s1 00000011
这样转变成short时会只保留后八位
(上面的不会丢失精度,但是如果加的数字比较大时(大于255)出现问题了)
作者: 朱志江    时间: 2013-6-7 21:44
回答楼主的问题:
short s1 = 1;//这一句的意思是:创建一个short类型的变量s1,值为1
s1 = s1 +1;//当s1与1进行加法运算的时候s1会自动类型提升为int类型的,但是s1 = s1+1中的赋值变量类型仍然为short,所以会编译出错
与short s1 = 1;
s1+=1;//这句话的意思是:s1 = (short)(s1+1);会自动做一次类型转换,所以第二个方法没有问题.





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