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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 不破大地 中级黑马   /  2013-6-20 08:39  /  1745 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Super_Class 于 2013-6-24 18:32 编辑

short s1=1;
s1=s1+1;
为啥这个代码不能够通过,而下面的代码不能通过啊? why?  疑惑啊?
short s1=1;
s1+=1;

评分

参与人数 1技术分 +1 收起 理由
Super_Class + 1

查看全部评分

8 个回复

倒序浏览
s1=s1+1;这个是一次+运算和一次=赋值运算,一共两次运算,   结果自动提升int型,而S1是short型,需要手动强转

是S1+=1;这个+=运算符是进行了一次运算,内部会自动提升并赋值。

评分

参与人数 1技术分 +1 收起 理由
Super_Class + 1

查看全部评分

回复 使用道具 举报
上面那段代码, 把int型赋给short型, 有没有进行类型转换, 所以通不过.

而下面那段用+=运算符的, 应该是+=操作内部有强制类型转换的过程,
往这儿看:
  1. public class Test {
  2.        
  3.         public static void main(String[] args) {       
  4.                
  5.                 String str = "10";
  6.                 int i = 1;
  7.                 char c = 'a';
  8.                
  9.                 c+=i;
  10.                 System.out.println(c);                //输出字符'b'
  11.                
  12.                 i+=c;
  13.                 System.out.println(i);                //输出整型99
  14.                
  15.                 /*i+=str;                                        //编译报错, 因为不能把String型强制类型转换成int型. cant cast String to int.
  16.                 System.out.println(i);*/

  17.         }
  18. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
Super_Class + 1

查看全部评分

回复 使用道具 举报
short s1=1;
s1=s1+1;    s1(short类型) = s1(short类型,在与int类型进行计算时,会提升到int类型) + 1(int类型)
                   得到的结果却又赋给 short类型,需要强制转换。
short s1=1;
s1+=1;        再运算的时候,内部会自动帮你转换!

评分

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

查看全部评分

回复 使用道具 举报
类型转换异常,因为1是int型,int型加上short型会自动提升为int类型,int类型再赋值给short类型就会报错了;
而下面的表达式是一次运算符,它不会有自动转型的过程,所以编译是可以通过的。

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
short s1=1;
s1=(short) (s1+1);应该是这样!!

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
shang1jk 发表于 2013-6-20 09:07
上面那段代码, 把int型赋给short型, 有没有进行类型转换, 所以通不过.

而下面那段用+=运算符的, 应该是+= ...

弱弱地问一句,你是怎样将代码粘贴得这么工整的,为啥每次我一把代码粘贴上去,缩进就自动没有了,也无法使用tab键进行缩进,只能通过空格去缩进,每次缩进的结果还参差不齐。
回复 使用道具 举报
short s1=1;
这句代码中,s1是short型,1虽然是整数(整型),但是,它在赋值给s1时会自动判断在不在short型的范围内,由于1这个值是固定的,因此可以赋值。
s1=s1+1;
这句代码中,short和int运算时,会自动提升,结果是int型,这里还没有错;但是要将(s1+1)运算后的int型数据赋值给short型的s1,就可能会丢失精度。因此报错。(s1是个变化的值,提升一个整数是不确定的话,就会容易丢失精度)。
s1+=1;是+=内部先将1强制转化为short型,然后与short型的s1相加,就没错了。
回复 使用道具 举报
关于本题,楼上几位兄弟都说的差不多了。
我在这里说一下原理,我也是刚刚学习到的



Short 短整型  值范围为-32768到32767 他是16位的
Int 整型 =-2147483648 至2147483647 32位的

Long 长整型 值范围为=-9223372036854775808  他是64位的



所以小类型数据转换大类型数据的时候是自动转换的(装箱) 比如你题中的 s+1(这时候就是整数类型)

但再赋值为s(short类型)的时候 就必须要强制类型转换了(因为是大类型数据的转换小类型数据,也就是拆箱) 所以会报错
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马