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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

1黑马币
short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?大神们讲解下呗{:2_30:}

43 个回复

正序浏览
LARK 中级黑马 2016-10-12 08:56:10
43#
s1=s1+1有错,运算时提升为int类型,赋值给short须强转。s1+=1没错,底层自带强转功能
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
在s1 = s1 + 1 这个执行时,在这里右边的s1是作为变量参与运算,byte、short、char等类型的变量在参与运算时,会自动提升为int 类型,所以右边运算后得到的数据类型是int类型赋值给左边的short类型时会丢失精度,而右边又没有强制转换,所以系统会报错
回复 使用道具 举报
正好我今天发表的java基础面试题中有对这个题目的讲解,供你参考。
http://bbs.itheima.com/thread-324592-1-1.html
回复 使用道具 举报
数字默认是int   一旦越界怎么办,所以强制类型转换
回复 使用道具 举报
short s1 = 1; s1 = s1 + 1;//计算时s1自动隐式向上转为int型,再赋值给s1时系统不能自动隐式向下转型,
short s1 = 1; s1 += 1;//不进行类型转换
回复 使用道具 举报
前者会进行自动转型   s1加1后  变成整数数据类型    后者不会报错
回复 使用道具 举报
定义的s1是short类型的,而1常量默认是int类型的,当执行s1 = s1 + 1;时,java虚拟机会提升右边s1的类型为int型进行运算,而算出的和是int,左边s1是short,int类型的范围比short类型范围大,所以赋值时,会产生精度丢失。编译失败。而s1+=1;拆开是s1=(short)s1+1;,+=符号本身隐藏了强制转换,所以s1+=1;没有错。        
回复 使用道具 举报
定义的s1是short类型的,而1常量默认是int类型的,当执行s1 = s1 + 1;时,java虚拟机会提升右边s1的类型为int型进行运算,而算出的和是int,左边s1是short,int类型的范围比short类型范围大,所以赋值时,会产生精度丢失。编译失败。       而s1+=1;拆开是s1=(short)s1+1;,+=符号本身隐藏了强制转换,所以s1+=1;没有错。        
回复 使用道具 举报
adomwon 发表于 2016-3-27 08:49
short s1 = 1; s1 = s1 + 1;编译时程序会报错,因为默认整数类型是int类型,,s1和1进行运算时,会先将s1自动类 ...

说的可以吗!
回复 使用道具 举报
fanxiaolin 发表于 2016-4-13 20:49
很简单, 应为 shor  和byte  在进行运算的时候 , 会自动  转换成int 类型,  是 ...

short s1 = 1; s1 = s1 + 1 ;
其实是这样的  

s1 是 short  类型  但是  1 是 int  类型  

如果  s1 写成int 类型 就不错了  
如果 真的要强转的话    加short 就是了!
回复 使用道具 举报
很简单, 应为 shor  和byte  在进行运算的时候 , 会自动  转换成int 类型,  是
回复 使用道具 举报
short s1 = 1; s1 += 1;或者short s1 =1;s1=(short)(s1+1);
回复 使用道具 举报
short s1=1
s1+=1;

这样就不会有错,自加会在底层执行.
回复 使用道具 举报
15614014298 来自手机 中级黑马 2016-4-6 10:49:21
30#
第一个是数据类型自动提升了
回复 使用道具 举报
1是int型,s1是short型,s1+1的结果也是int型,因为运算中的s1被默认提升为了int型,所以结果不能直接赋值给short型的s1,需要强制类型转换才能赋给s1。 s1 = (short)(s1 + 1);
回复 使用道具 举报
short s1=1;s1=s1+1;中s1是short型与1相加结果int型,会出错,第二个没错的
回复 使用道具 举报
你们的回答都是官方版本啊  {:2_30:}
回复 使用道具 举报
涨姿势了!
回复 使用道具 举报
Ak-47 中级黑马 2016-3-31 01:13:09
25#
大婶们的回答很好啊,让我豁然开朗啊
回复 使用道具 举报
s1 = s1+1;会报错,这是因为在运算的时候,short类型的会自动提升为int类型,当两个int类型的相加得到的还是int类型的,把int类型的赋值给short类型需要强制转换,而这个没有转换,会有精度损失,修改为:s1 = short(s1+1);
而s1 += 1;不报错是因为这个隐藏了一个强制转换问题,等价于 s1 = short(s1+1);
回复 使用道具 举报
123下一页
您需要登录后才可以回帖 登录 | 加入黑马