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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

在一本叫电脑报的书上看到一个别人提问的问题,这个问题我感觉很菜鸟,可是我自己真的不会啊
题目如下:
short s=0;
s+=1;
正确,而
s=s+1;
不正确,为什么?

我感觉这两种情况都对啊,为什么下面的不对啊,我感觉下面的赋值法方法更方便啊!
为什么?为什么?想的姐头都大了!唉..

评分

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

查看全部评分

10 个回复

倒序浏览
s=s+1;这句,s的类型为short,可是1的类型默认为int,s+1的类型为int,怎么能赋值给类型为short的s呢?如果一定要的话要强制转换类型,即s=(short)(s+1);。
+=是一个赋值运算符,即s自加1再赋值给s,所以正确。

评分

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

查看全部评分

回复 使用道具 举报
short s=0;
s+=1;   //l正确,因为转换与加1都是一次自动完成的

s=s+1; //不正确,因为s是short型,1是int型,相加后提升为int型了,所以要转换类型:s=(int)(s+1)就行了

评分

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

查看全部评分

回复 使用道具 举报
对于short s = 1; s += 1;由于 += 是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。
对于short s = 0; s = s + 1; 由于s+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s1时,编译器将报告需要强制转换类型的错误。

评分

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

查看全部评分

回复 使用道具 举报
2楼正解。。。
回复 使用道具 举报
short s=0;
s+=1;
s=s+1;

  s=s+1; // 右边 s+1 运算完 类型自动提升为int类型 ,而左边还是short类型,在编译时会出现编译时期异常,

   s+=1; // += 是赋值运算符,自身有类型转换功能,在底层 运算完后它自身会完成类型转换动作,然后赋给左边的short。

{:soso_e204:}
回复 使用道具 举报
short x=x+1; 这种情况下 一般都会编译报错,因为=右边有变量存在,会有精度丢失的可能。这里的x是short类型2字节存储空间的变量,1是int类型4字节,=右边就会将x动提升至int型,而等号左边是short ,所以会有找到int,需要short。这里的+=也是赋值运算符哦,所以会有类型的自动转换动作,shortx=short(x+1),此运算符的效果基本上与指定 result = result + expression 相同,不同的只是仅计算一次 result。http://msdn.microsoft.com/zh-cn/library/f6z5yhhs(v=vs.80).aspx
回复 使用道具 举报
好吧 又这么多人  回答了  你该知道答案了
回复 使用道具 举报
纠正一下三楼的错误,
short s=0;
s+=1;   //l正确,因为转换与加1都是一次自动完成的
s=s+1; //不正确,因为s是short型,1是int型,相加后提升为int型了,所以要转换类型:s=(int)(s+1)就行了

s=s+1这一句,左边还是short类型,右边应该强制转换成short类型才对

回复 使用道具 举报
short s=0;s+=1; 正确,相当于s=(short)(s+1);在内部进行了强制转换。
  s=s+1;不正确,  i为int类型,s+1  结果是int类型,能赋值给short类型的s,所以错误。
应该s=(short)(s+1);

回复 使用道具 举报
几种情况上面已经解答完毕,你总结下!这种问题以后便不会错了
s+=1;正确是因为+=符号有个自动转型动作,把short型自动提升为int型,毕爷视频有这个的讲解。
s=s+1;错误是因为int型不能赋值给short型可改为s=(short)(s+1);老毕的视频也有讲解


回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马