黑马程序员技术交流社区

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

作者: 顾传文    时间: 2013-2-23 10:18
标题: 赋值运算符
本帖最后由 顾传文 于 2013-3-12 09:16 编辑

short s = 3;
s =  s+5;/编译通过
s += 5;//编译不通过
“+=”会自动转型,那么它是先将5转成short类型的再相加,还是等相加后变成int类型的再强转呢?
作者: 逍林游    时间: 2013-2-23 10:23
s =  s+5;/编译不通过
s += 5;//编译通过
“+=”会自动转型,先将5转成short类型的再相加。
作者: 杨玲    时间: 2013-2-23 10:44
这个问题貌似涉及到了一个左值和右值的概念。

简单点说吧。在运算时,以左边的值为准则,比如:

  1. short s = 3;
  2. s =  s+5;/编译通过,这一句,
  3. 、s+5,这个s在左边,它又是short类型,所以自动的把5转成了short型,并与s相加

  4. 下一步:算等号两边,
  5. s = s+5;
  6. 前面分析了s+5它的运算结果是short类型的,而等号左边的s也是short类型的,把short类型的值赋给short类型的变量,通过是理所应当的嘛
复制代码
下面一句同理了,但它报错的关键就在于,编译器的检测方式,它是先接侧左边s,好的是一个short类型的,在检测右边5,哦,int类型的,

再一比较:把int 类型的值赋给short,嗯?然后就给你报错了!呵呵!
作者: 陈圳    时间: 2013-2-23 11:04
低位到高位运算时,会自动强转的.short与5运算时,
过程是这样的s=s+(int)5;
而short低于int型,会损失精度,如果那不是5而是65536,那short就溢出了.
而s+=5;是一步操作.强转的动作系统帮你完成了.所以不会抱错
作者: 杨剑    时间: 2013-2-25 14:28
short s = 3;
s = s + 5;
//编译不通过,因为s与5进行操作的时候,s首先会自动提升为整型,然后与5相加,得到的数仍然是整型的,高精度的转成低精度的需要强制类型转换才能转成short
s+=5;//此句话是编译通过的,不等价与s=s+5;它的意思是类型系统会自动帮你转换。




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