黑马程序员技术交流社区

标题: 求解:最菜鸟的一个问题,可是我真的不会. [打印本页]

作者: 小丑的媳妇2    时间: 2013-3-8 23:57
标题: 求解:最菜鸟的一个问题,可是我真的不会.
在一本叫电脑报的书上看到一个别人提问的问题,这个问题我感觉很菜鸟,可是我自己真的不会啊
题目如下:
short s=0;
s+=1;
正确,而
s=s+1;
不正确,为什么?

我感觉这两种情况都对啊,为什么下面的不对啊,我感觉下面的赋值法方法更方便啊!
为什么?为什么?想的姐头都大了!唉..
作者: 何旭程    时间: 2013-3-9 00:06
s=s+1;这句,s的类型为short,可是1的类型默认为int,s+1的类型为int,怎么能赋值给类型为short的s呢?如果一定要的话要强制转换类型,即s=(short)(s+1);。
+=是一个赋值运算符,即s自加1再赋值给s,所以正确。
作者: 张卫刚    时间: 2013-3-9 00:08
short s=0;
s+=1;   //l正确,因为转换与加1都是一次自动完成的

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

作者: 肖明凯    时间: 2013-3-9 00:09
对于short s = 1; s += 1;由于 += 是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。
对于short s = 0; s = s + 1; 由于s+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s1时,编译器将报告需要强制转换类型的错误。
作者: wodeairenw    时间: 2013-3-9 00:10
2楼正解。。。
作者: 谢玉成    时间: 2013-3-9 00:12
short s=0;
s+=1;
s=s+1;

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

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

{:soso_e204:}
作者: 袁术森    时间: 2013-3-9 00:19
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
作者: amen0205    时间: 2013-3-9 03:45
好吧 又这么多人  回答了  你该知道答案了
作者: michaelchen    时间: 2013-3-9 08:45
纠正一下三楼的错误,
short s=0;
s+=1;   //l正确,因为转换与加1都是一次自动完成的
s=s+1; //不正确,因为s是short型,1是int型,相加后提升为int型了,所以要转换类型:s=(int)(s+1)就行了

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


作者: 黑马17期-闫东东    时间: 2013-3-9 18:48
short s=0;s+=1; 正确,相当于s=(short)(s+1);在内部进行了强制转换。
  s=s+1;不正确,  i为int类型,s+1  结果是int类型,能赋值给short类型的s,所以错误。
应该s=(short)(s+1);


作者: 聂益飞    时间: 2013-3-9 18:54
几种情况上面已经解答完毕,你总结下!这种问题以后便不会错了
s+=1;正确是因为+=符号有个自动转型动作,把short型自动提升为int型,毕爷视频有这个的讲解。
s=s+1;错误是因为int型不能赋值给short型可改为s=(short)(s+1);老毕的视频也有讲解







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2