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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李建锋 黑马帝   /  2011-12-7 00:05  /  4047 人查看  /  18 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

short s1 = 1; s1 = s1 + 1;是否正确,为什么? short s1 = 1; s1 += 1;编译会通过吗?

18 个回复

倒序浏览
              short s1 = 1;
               s1 = (short) (s1 + 1);
这样写是可以的,因为s1+1时由于1是int类型,不会自动转换为short型 ,此时就高不就低,相加后就会转换成int这时再赋给short型的变量就会报错,就好像张老师说的,你要把你个人当男人用,编辑器说不行,这时你强转,说不怕,出了问题我负责,当然就可以通过了。
        short s1 = 1; s1 += 1;这是标准的运算方法,是可以的

评分

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

查看全部评分

回复 使用道具 举报
short s1 = 1; s1 = s1 + 1这样编写会编译失败,应为s1是short类型,而1是int类型,因为这样编写会丢失精度。
short s1 = 1; s1 += 1这个是可以通过的,应为+=是赋值预算符,是把左右两边的数值的和赋给左边

评分

参与人数 1技术分 +1 收起 理由
admin + 1 答题有分!

查看全部评分

回复 使用道具 举报
本帖最后由 benbenqi 于 2011-12-7 07:22 编辑

short s1 =1 ;  s1= s1 + 1    //编译失败,是先做+1运算得到int型再赋给short型,丢失精度
short s1=1;  s1 += 1     //编译通过,因为+=运算符在给s赋值时,自动完成了强制转换操作

评分

参与人数 1技术分 +1 收起 理由
admin + 1 答题有奖!

查看全部评分

回复 使用道具 举报
short s1 = 1;
s1 = s1 + 1;//是错误的。进行了两次运算,先+后=,先将s1转换成整型(4个字节)再+1,赋值给short(2个字节)时,会损失精度。
                   要想编译通过必须进行强制转换:s1 =(short)( s1 + 1);
s1 += 1;//编译会通过.进行了一次运算,”+=“这个运算符进行了自动的强制转换。

评分

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

查看全部评分

回复 使用道具 举报
本帖最后由 方书堂 于 2011-12-7 11:18 编辑

short s1=1;s1=s1+1;编译是不会通过的。因为short s1=1是吧s1定义为一个短整形,而S1+1因为1是Int型的。所以S1会被自动转换成Int型然后在加上1,结果也会是int型。而s1=s1+1左边市short型。右边是int型,直接赋值会损失精度。而S1+=1是可以被编译通过的,因为这个是一个赋值运算就是把s1+1值转换成short型再赋给s1也就是相当于S1=(short)(s1+1)

评分

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

查看全部评分

回复 使用道具 举报
武超 黑马帝 2011-12-7 11:38:53
7#
本帖最后由 武超 于 2011-12-7 11:39 编辑

short s1=1;s1=s1+1;编译是不会通过的。因为short s1=1将s1定义为一个short类形,而1是int类型的。short类型比int类型位数少,在运算s1+1时将结果隐式的转化成了int类型,运算完后要将(s1+1)赋值给s1,而s1是short类型的int型转化成short型不能隐式转换。
而short s1 = 1; s1 += 1;可以,就是一个赋值运算语句,自动强制转化

评分

参与人数 1技术分 +1 收起 理由
王德云 + 1

查看全部评分

回复 使用道具 举报
荣凯旋 黑马帝 2011-12-7 11:46:49
8#
short s1 = 1; s1 = s1 + 1;编译时通过不了的,因为1是int型,s11=s1(会自动提升为int型)+1,这样无法赋值给左边的s1  会丢失精度,编译不通过
为什么? short s1 = 1; s1 += 1(这个完成了自动转换过程);编译通过!!
楼主加油吧 一起进6期丫 哈哈
回复 使用道具 举报
t_mac 黑马帝 2011-12-7 12:40:28
9#
本帖最后由 t_mac 于 2011-12-7 12:42 编辑

对于楼主这个问题,我拿byte类型来举例吧,道理是一样的。
byte b = 2;
         b =b+ 3;
System.out.println(b);
编译结果是不对的,因为java中,整数类型默认的是int
而不同的类型之间是不能之间做运算的,对于整数来说可以做运算,但必须有一个操作为前提
就是自动类型提升,先要把两个数据提升为同一个类型,原则是小的向大的提升,上例中 b是byte
型占一个字节,而3默认为int型 为4个字节,所以要把b提升为四个字节
byte b=2 =00000010->00000000 00000000 00000000 00000010
int  3=                            00000000 00000000 00000000 00000011
运算结果为                     00000000 00000000 00000000 00000101
要想把以上的结果存到byte里 必须强制转换
b = (byte)(b+3); 而+=自动帮我们完成了这个动作,所以你写b+=3;是可以通过的;
可是这也带来一个问题 如果运算结果溢出即大于127或是小于-128也不会报错,所以大家使用的
时候要特别注意。

评分

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

查看全部评分

回复 使用道具 举报
short s1 = 1; s1 = s1 + 1;编译会错误,是因为,s1定义为了short型,1 默认是int型,在进行运算时会有类型转化成int型再赋值给S1,此时S1是被定义为Short型,这时一个高精度赋值给低精度类型就损失精度, short s1 = 1; s1 += 1;编译正常,因为会有自动强制类型转换,

评分

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

查看全部评分

回复 使用道具 举报
一楼说得精辟!
回复 使用道具 举报
李明 黑马帝 2011-12-10 19:54:22
12#
short s1 = 1; s1 = s1 + 1;是否正确,为什么?
不正确。因为s1是short类型,而s1+1运算的结果是int类型,因为1是int类型,所以s1+1的运算结果自动提升为int类型。所以不能把int类型的值赋给short类型。
short s1 = 1; s1 += 1;编译会通过吗?
正确。因为+=运算是自动完成强制转换的,相当于s1=(short)(s1+1),所以正确。

评分

参与人数 1技术分 +1 收起 理由
王德云 + 1

查看全部评分

回复 使用道具 举报
黄达标 黑马帝 2011-12-11 00:02:12
13#
short s1 = 1; s1 = s1 + 1;不正确
    因为在做s1+1的运算的时候,系统会将s1的类型转化为和1一样的int类型,而将所得到的intl类型的值赋给short型的s1的时候,系统将会报错。
short s1 = 1; s1 += 1;编译可以通过
    因为 += 相当于赋值,并且没有类型的转换动作,它只是一次运算,没有相加的运算在里面。
俺也是初学者,终于碰到了一个能独立作答的问题了。

评分

参与人数 1技术分 +1 收起 理由
王德云 + 1

查看全部评分

回复 使用道具 举报
张帅 黑马帝 2011-12-17 16:30:33
14#
都挺厉害的,上面说的都正确,没什么可说的了,分不好赚啊
回复 使用道具 举报
刘健 黑马帝 2011-12-18 11:55:03
15#
short s1=1;s1 = s1 +1;这个是编译不能通过的,s1+1已经被JAVA自动按int类型做处理了,要继续当做short用就需要做强制转换了
后面的是正确的
回复 使用道具 举报
唐林渊 黑马帝 2011-12-18 16:15:59
16#
第一个  错误的,应该在编译时就会提示错误,因为系统会检测到由short无法自动提升到int(就是你的数字1.)
第二个 正确的,因为+=  就是讲的那种强制类型转换,也就是说,只是运算。都是与+=前面的数是一个类型的.
回复 使用道具 举报
杨银川 黑马帝 2011-12-18 18:48:16
17#
我这里就简单说几句,short s1 = 1; s1 = s1 + 1;不正确,因为1是int型,s1 = s1 + 1后,s1就从short型变成int,所以不对,应该用到强制类型转换了,而 short s1 = 1; s1 += 1;是正确的,因为+=这个符号,是java内部定义的它可以自动进行类型转换。希望对你有帮助!
回复 使用道具 举报
梁俊 黑马帝 2011-12-19 11:34:35
18#
short s1 = 1; s1 = s1 + 1;
因为1为int类型,所以s1+1会自动提升表达式的类型为int,再赋值给short类型的s1时,编译器会报告需要强制转换类型的错误
short s1 = 1; s1 += 1;+=是Java语言规定的运算符,编译器会进行特殊处理,所以会正常编译
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马