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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

short s1 = 1; s1 = s1 + 1;与 short s1 = 1; s1 += 1;有什么区别?
为什么第一个错误!第二个正确?

评分

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

查看全部评分

6 个回复

正序浏览
short s1 = 1; s1 = s1 + 1;有错,s1是short型,s1+1是int型,不能显式转化为short型。可修改为s1 =(short)(s1 + 1)
回复 使用道具 举报
风吹月er落 发表于 2013-5-18 09:42
short. -32768到-32767 有符号16位整数,而int 为32位i有符号整数,第一个错误为显式转换编译错误原因是赋值 ...

嗯,现在明白了。谢谢
回复 使用道具 举报
我感觉他们都说对了,但他们没总结出来:C#是从右边开始算的,因此计算的时候,赋值运算符右侧的表达式会转化为其中精度最大的,然后赋值给赋值运算符左边的值
以下几个都会报错:
如:short s1 = 1; s1 = s1+1;   // =右边的精度最大的是int类型的1,想把int类型赋给short类型当然会出错

            int i = 9;i = i + 1.2;// =右边的精度最大的是double类型的1.2,想把double类型赋给int类型当然会出错

            float f = 1.1f; f = f + 1.1;  // =右边的精度最大的是double类型的1.1,想把double类型赋给float类型当然会出错

评分

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

查看全部评分

回复 使用道具 举报
风吹月er落 来自手机 中级黑马 2013-5-18 09:42:53
板凳
short. -32768到-32767 有符号16位整数,而int 为32位i有符号整数,第一个错误为显式转换编译错误原因是赋值运算符右侧的算术表达式在默认情况下的计算结果为int 类型,在不丢失精度条件下可以由小到大隐式转换,但不可以由大到小解决问题应使用强制转换
s1=(short )(s1+1);
而第二个正确是因为整数1从int 隐式转换为short ,如果整数长度超过short 存储长度,则会产生显式转换编译错误,如下
s1+=32768;来自: Android客户端

评分

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

查看全部评分

回复 使用道具 举报
本帖最后由 神之梦 于 2013-5-18 00:03 编辑

s1=s1+1;这句中的1是int类型,你这样运算会自动提升s1值的数据类型,这是java中的数据类型自动提升,也就是说你这样运算中,java会把s1的数值从short类型提升到int类型,进行运算完后,把结果赋值给short型的s1,这样就会有可能损失精度,编译就会报错。
而s1+=1;这句虽然相当于s1=s1+1;但是+=表示的是一个赋值运算符,它有自动转换动作,这句只做赋值运算。
s1=s1+1;这句是右边先相加再赋值给左边,相当于有两个动作。
s1+=1;只是在做赋值运算,相当于只有一个动作。所以就不会发生类型提升的情况,也就不会报错。

评分

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

查看全部评分

回复 使用道具 举报
算法都是一样的,不过定义short不对,应该定义为int类型。因为short是2个字节而int是4个,你s1+1后结果就成了int类型了,你在定义short类型,损失数据精度

评分

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

查看全部评分

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