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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 杨永峰 于 2012-5-16 13:30 编辑

如果运行类似  short s=5; s=s+2; 这样的语句,是会出现错误的。s = s + 2; 中,在进行算术运算 s + 2 时,s 是之前定义的s的一个复制还是s本身?如果是s本身,那么算术运算后s对应的存储区域类型提升为int,但是 s = s + 2 赋值号左边的s 的数据类型并没有变化,在编译环境的眼中,仍然是最初定义的那个s,所以赋值失败??或者是其他的什么情况?     s = 8;是正确的,那么 8 和 (s + 2 )的区别是什么?

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

10 个回复

正序浏览
杨永峰 发表于 2012-5-17 12:24
short s = 5 , s = s +2 运算时 先将short型的s 提升为int型,因为在java中,整数数据类型是int型,所以 ...

因为是先求和,在赋值,在求和的过程中,低精度的s与java默认的int型数据进行求和,就会将byte类型强制转换成高精度的int型,所以转换后就成int型的s跟2求和,得到的结果也就是int型的7.但是你定义的s是byte型的,在把7给s重新赋值时,int型的值赋值给byte型,java就会报错。
回复 使用道具 举报
杨康 发表于 2012-5-16 22:59
short s = 5 , s = s +2 运算时 先将short型的s 提升为int型,因为在java中,整数数据类型是int型,所以就 ...

short s = 5 , s = s +2 运算时 先将short型的s 提升为int型,因为在java中,整数数据类型是int型,所以就变成了int型的5和int型的2求和,得到的结果就是int型的7,再重新赋值给short型的s,就会提示损失精度。

红色部分是不是矛盾了?这正是我纠结的地方?s 提升为int了,为啥后面又赋值给short型的s了?s 想变啥就变啥啊?
回复 使用道具 举报
杨康 中级黑马 2012-5-16 22:59:29
9#
short s = 5 , s = s +2 运算时 先将short型的s 提升为int型,因为在java中,整数数据类型是int型,所以就变成了int型的5和int型的2求和,得到的结果就是int型的7,再重新赋值给short型的s,就会提示损失精度。
回复 使用道具 举报
short s=3;
s=s+3;3是int  s被升为int (s+3)值为int 但s为short 所以错误
s=(short)(s+3);
s+=3都是正确(这个默认自动转化啦)
回复 使用道具 举报
于陈 发表于 2012-5-16 14:56
short s=3;
s=s+2;
首先java里面整数默认为int型,那么 short型的s和int型的2相加,为了不损失精度,默 ...

谢谢,s + 2 不能赋值给short类型的变量,说明s+2不是int型的常量。那么s+2存储在提升为int型的s中还是存储在新的存储空间中?如果s已经提升为int型了,s + 2 完全可以赋值给它。其实我问的是具体的编译过程是怎样的?
回复 使用道具 举报
short s=3;
s=s+2;
首先java里面整数默认为int型,那么 short型的s和int型的2相加,为了不损失精度,默认的向高精度转换,得到一个int型的结果,现在你又把这个int类型的数赋值给short型的s,就会报错有可能损失精度,解决办法就是强制转换 s=(short)(s+2)
int s=8;
s=s+2;
这句为什么正确,

int型的s+int型的2结果依然是int型,把一个int赋值给int当然没问题了~

哥们,我昨天才看完毕老师的第二天的视频,很清楚的记得毕老师经过这类问题,我建议你还是仔细看下基础视频吧~
回复 使用道具 举报
这个问题毕哥视频中第二天的有讲。
      s=s+2 中是做两次运算,一、先计算s+2,此时得到int型数据。二、再讲得到的int数据赋给原short型的s,两种数据类型不同,此时不会做自动转换-——————错误。
     s+=2   中 只做一次运算,将“=”左右两边数值的和赋给s,此时会自动转换。 跟short s=2,大致相同,只要是2在 short的范围内就可以。
   
回复 使用道具 举报
short s=5; s=s+2中2是int型的,那么java会把s自动提升为int型,那么结果s+2为int型赋给一个short型会出错,会损失精度,改为s+=2就不会了,因为+=是一个运算符号,java会把2当成short型来处理
回复 使用道具 举报
s当然还是本身的s,他的类型也是不会变化的依然是 short 的。你问的这个问题的根源在于 算术预算赋值部分, s = s + 2; 当你在编译器里打出这句的时候编译器是会报错的。 因为 (s + 2) 系统会默认的把他当成 int 而你去赋值的却是 short 所以 你只需要这样改:s = (short)(s+2)就对了 。 = 左右两边的类型就一致了!

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
楼主不妨把下面这两句运行一下:
short s = 5;
s+=2;
希望对你有帮助
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马