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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 阳丹 于 2013-6-7 22:42 编辑

short s1 = 1;s1 = s1 +1;与short s1 = 1; s1+=1;有什么区别
第一种方式不能通过编译 但是第二种可以  想不通是为什么  求指点

10 个回复

倒序浏览
第一种不能自动提升类型 第二种可以
回复 使用道具 举报
因为第一种里,1被默认是int类型,而你定义的变量是短整型,2种不同类型相加,如果想顺利通过编译,需要使用强类型转换,如(short);
而第二种里,是“+=”,这个被JAVA重新封装过的连接符会自动进行类型转换,所以不需要你手动完成,自动通过编译。
回复 使用道具 举报
s1 = s1 +1  s1为short 1是整型常量 默认是int类型的常量  不同的类型运算 都往精度高的转换 这里面一个为short 一个为int  所以  s1 +1的结果就是int  但是 int赋值给左边的short变量  出现精度损失  就会编译出错  所以。。  第二种 Java对+=做了内部的封装  运算的过程还是和 s1+1一样 但是  运算玩之后  Java会自动帮你把本来是int类型的结果强转为short  不用你来做 这样 就编译通过啦  记住就行了

评分

参与人数 1技术分 +1 收起 理由
刘凯 + 1 赞一个!

查看全部评分

回复 使用道具 举报
short s1 = 1;s1 = s1 +1;//这句话错的原因是,你不能把数据类型为int型的赋值给short型啊,这样会丢失精度
short s1 = 1; s1+=1;//而这句话里面+=这样的符号内容强制转换类型在里面,自动类型提升了,就会把short型默认转换为int型
回复 使用道具 举报
关于这一个问题,视频中有讲解啊
回复 使用道具 举报
受教了,原来是这样,我原来以为是一回事呢。感谢楼主与诸位回答的哥们。
回复 使用道具 举报
问题是否解决?解决请该为【已解决】
回复 使用道具 举报
第二个 +=的 可以 自动转型

第一个需要强制转型 (short)
回复 使用道具 举报
第一个例子中加的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)出现问题了)
回复 使用道具 举报
回答楼主的问题:
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);会自动做一次类型转换,所以第二个方法没有问题.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马