黑马程序员技术交流社区

标题: 今天老师留了个作业,自己大概有点不懂 [打印本页]

作者: God’s favoure    时间: 2014-10-16 20:37
标题: 今天老师留了个作业,自己大概有点不懂
short  s = 1;
s = s+1;

short s = 1;
s+=1;
我知道第一种肯定是没法编译通过的,可是第二种,我印象里面一直是:s+=1;相当于s=s+1;可是第二种可以编译成功,能详细讲一下么?
大神,这厢有礼了.

作者: 唐王潮    时间: 2014-10-16 20:43
+=这种运算,内涵了强制类型转换功能,s+=1等价于s=(short)(s+1)
作者: Eric1225    时间: 2014-10-16 21:00
s+=1 <=> s =  (s的类型)(s+1)
作者: God’s favoure    时间: 2014-10-16 21:07
Eric1225 发表于 2014-10-16 21:00
s+=1  s =  (s的类型)(s+1)

主要是第二个,第一个需要强转就好了,但是第二个不懂为什么是对的.
作者: Eric1225    时间: 2014-10-16 21:11
God’s favoure 发表于 2014-10-16 21:07
主要是第二个,第一个需要强转就好了,但是第二个不懂为什么是对的.

s+=1 过程是
s+1 此时结果为int吧!
然后自动(short)(s+1)进行了强转
最后s=(short)(i+1)赋值给s所以不会报错
作者: 微笑凡    时间: 2014-10-16 21:58
这个简单。。。因为1是int型,占四个字节,而short型的s只占两个字节,当s+1是低位的s会向高位转,故s+1运算后为int型,无法复制给short型的s,故不能编译。。。
作者: mingtianrsm    时间: 2014-10-16 22:18
第一个类型不匹配,因为=右边有未知数;
第二个是赋值运算,虽然进行了+1运算,但是它的最终目的是赋值,所以先对=两边的结果进行类型判断,如果不一致的话会对右边进行强制转换,所以可以编译通过。第一个不是赋值运算,所以不会对两边进行检测,等右边算好去传给左边时,类型不匹配就错了
作者: 私有的    时间: 2014-10-17 09:17
第1种是进行了两次运算 所以会提示丢失精度。第二种是只进行了一次运行
作者: God’s favoure    时间: 2014-10-17 14:01
mingtianrsm 发表于 2014-10-16 22:18
第一个类型不匹配,因为=右边有未知数;
第二个是赋值运算,虽然进行了+1运算,但是它的最终目的是赋值,所 ...

说的挺直白的,想通了.
作者: 奋斗的小孩    时间: 2014-10-17 16:24
最主要的是s+=1是一个赋值运算符




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