黑马程序员技术交流社区

标题: 赋值和比较运算符 [打印本页]

作者: 周志伟    时间: 2013-3-29 19:32
标题: 赋值和比较运算符
本帖最后由 周志伟 于 2013-3-29 20:00 编辑

short s = 4;
s = s + 3;(这句会报错),错误提示如图所示:

s+=3;(这句就不会报错)(为什么呢???)----因为“+=”会做自动转换,而“=”不会。(疑问:short s = 4;既然在java里出现的4默认是int型,那这句赋值语句岂不是把int型的赋值给short型的啦?毕老师又说“=”不会自动转换,执行 short s = 4;这一句应该是错误的啊?因为是把高类型的赋值给了低类型的了。)
System.out.println(s);

作者: 我手心里的宝    时间: 2013-3-29 19:49
byte short 直接赋值是不会报错的,虽然默认值是int  但是 short b = 27; 这样是给short赋值 但是如果是long类型的你必须long a=5L;这样标识
默认int 是  3 + b;
这样3默认的是int  所以运算会出错 不同类型的数值是不可以进行运算的
作者: 刘胜寒    时间: 2013-3-29 19:53

s = s + 3;
先自动将s转化为范围较大的int型,然后和3相加,得到一个int型,再赋给short型变量,范围大的赋给范围小的,编译器不允许这么做。所以报错。

s += 3;
类似于  s = (short)(s+3);
作者: _王涛    时间: 2013-3-29 19:58
执行 short s = 4;与执行s = s + 3;是两个不同的概念,short s = 4是因为4在short类型的范围之内,是个固定的值所以底层自动转换;
而s = s + 3,举个毕老师的例子:
好比两个四两的碗,得到的结果还是四两碗,如果把这四两的碗再交给二两的碗,此时就会装不下,而报错!
作者: 王亚东    时间: 2013-3-29 19:59
short的最大值是32767,short  s=4;可以直接编译通过,
而short s=4;s=s+3;编译器不会聪明到计算后再去判断s的值,他会认为s原来的值可能是32765之类的,加3后就会超出short范围,所以会报错
对于强转不强转的先不说,根据现实,只要划了等号,左边的就一定要在类型、范围上大于等于右边
作者: luguoyuanf    时间: 2013-3-29 23:21
首先我们来看short s =4;这个变量
它是把4整数赋值给short,在赋值前检查是否超过了short的范围,如果在范围以内就赋值成功,这里是没有问题的.
下面s=s+3;这个变量是s变量跟整数型4进行计算,在计算前s会自动提升为int类型数据,相加完成后以int类型数据
赋值给short s变量肯定是要丢失精度的,因为short占用2个字节,而int是4个字节.
4个字节赋值给2个字节的容器肯定是要丢失精度的.
而s +=3实际是s = s+3的简写,但是运算完成后进行了强制转换成short赋值,所以这里不会报错
如果最后得值超过了short的取值范围,它最后得值也是就是精度的.
希望可以给你带来帮助,如果有不明白的,可以私密我.

作者: 疯狂程序    时间: 2013-3-30 00:08
short s = 4;
s = s + 3;
s+=3;
s为short,3默认为int
你把一个s+3,精度提升为int
然后一个int赋值给short,肯定报错
至于 s+=3不报错是因为+=,他在内部自动转换了类型
s+=3就相当于s=(short)(s+3);

作者: 周志伟    时间: 2013-3-30 23:12
似水像火 发表于 2013-3-29 19:53
s = s + 3;
先自动将s转化为范围较大的int型,然后和3相加,得到一个int型,再赋给short型变量,范围大的 ...

明白了,谢谢啦。继续努力中~~~~
作者: 周志伟    时间: 2013-3-30 23:13
_王涛 发表于 2013-3-29 19:58
执行 short s = 4;与执行s = s + 3;是两个不同的概念,short s = 4是因为4在short类型的范围之内,是个固定 ...

借用毕老师的话来说明很形象啊,学习了。多谢哈~~
作者: _王涛    时间: 2013-3-30 23:18
周志伟 发表于 2013-3-30 23:13
借用毕老师的话来说明很形象啊,学习了。多谢哈~~

不客气...
作者: 周志伟    时间: 2013-3-30 23:23
王亚东 发表于 2013-3-29 19:59
short的最大值是32767,short  s=4;可以直接编译通过,
而short s=4;s=s+3;编译器不会聪明到计算后再去 ...

学习了,呵呵。谢谢啦
作者: 周志伟    时间: 2013-3-30 23:26
luguoyuanf 发表于 2013-3-29 23:21
首先我们来看short s =4;这个变量
它是把4整数赋值给short,在赋值前检查是否超过了short的范围,如果在范围 ...

很细致啊。谢谢了
作者: 周志伟    时间: 2013-3-30 23:26
疯狂程序 发表于 2013-3-30 00:08
short s = 4;
s = s + 3;
s+=3;

明白了,谢谢啦。




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