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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张海洋 中级黑马   /  2013-3-22 18:32  /  1422 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?

点评

请不要重复提问,你可以在论坛中搜索一下相关帖子,谢谢  发表于 2013-3-22 23:04

9 个回复

倒序浏览
额,这个问题已经经常被问到,以前帖子都有答案的,你可以找找看
回复 使用道具 举报
short s1 = 1; s1 = s1 + 1
损失精度
short,byte,char,做运算会先把自己转换成int类型
要赋给左边的s1需要强制转换  s1 = (short)(s1+1)

short s1 = 1; s1 += 1;
没错,做+=是直接赋给了s1,只做一次运算

评分

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

查看全部评分

回复 使用道具 举报
short s1 = 1; s1是short类型的
s1 = s1 + 1;s1+1结果是int类型的,int类型的赋给shotrt类型的出错
short s1 = 1; s1 += 1;不会出错
回复 使用道具 举报
当使用+=、-=、*=、/=、%=、运算符对基本类型进行运算时,遵循如下规则:
• 运算符右边的数值将首先被强制转换成与运算符左边数值相同的类型,然后再执行运算,
且运算结果与运算符左边数值类型相同。
在s1=s1+1;中,s1+1
运算的结果是int型,把它赋值给一个 short型变量s1,所以会报错;而在s1+=1;中,由于
是s1是short类型的,所以1首先被强制转换为short型,然后再参与运算,并且结果也是
short类型的,因此不会报错。那么,s1=1+1;为什么不报错呢?这是因为1+1是个编译时可
以确定的常量,“+”运算在编译时就被执行了,而不是在程序执行的时候,这个语句的效果
等同于s1=2,所以不会报错。前面讲过了,对基本类型执行强制类型转换可能得出错误的
结果,因此在使用+=、 -=、*=、/=、%=等运算符时,要多加注意。

评分

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

查看全部评分

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

评分

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

查看全部评分

回复 使用道具 举报
陈雨 中级黑马 2013-3-22 19:44:42
8#
1.short类型为大小为16位,int为32位,s1 + 1则是16位+32为,低位和高位相加结果会强制转换成32位int型数据.
但S1为16位=32位,所以结果报错了.
2.s1 += 1是一步运算所以s1 +=1不 存在这个问题.

类型大小.png (2.9 KB, 下载次数: 3)

类型大小.png

评分

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

查看全部评分

回复 使用道具 举报
lxww 中级黑马 2013-3-22 19:52:01
9#
亲。这个有很多人问过,你可以搜搜看。
回复 使用道具 举报
当使用+=、-=、*=、/=、%=、运算符对基本类型进行运算时,遵循如下规则:
• 运算符右边的数值将首先被强制转换成与运算符左边数值相同的类型,然后再执行运算,
且运算结果与运算符左边数值类型相同。
在s1=s1+1;中,s1+1
运算的结果是int型,把它赋值给一个 short型变量s1,所以会报错;而在s1+=1;中,由于
是s1是short类型的,所以1首先被强制转换为short型,然后再参与运算,并且结果也是
short类型的,因此不会报错。那么,s1=1+1;为什么不报错呢?这是因为1+1是个编译时可
以确定的常量,“+”运算在编译时就被执行了,而不是在程序执行的时候,这个语句的效果
等同于s1=2,所以不会报错。前面讲过了,对基本类型执行强制类型转换可能得出错误的
结果,因此在使用+=、 -=、*=、/=、%=等运算符时,要多加注意。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马