黑马程序员技术交流社区
标题:
运算上又犯晕
[打印本页]
作者:
不破大地
时间:
2013-6-20 08:39
标题:
运算上又犯晕
本帖最后由 Super_Class 于 2013-6-24 18:32 编辑
short s1=1;
s1=s1+1;
为啥这个代码不能够通过,而下面的代码不能通过啊? why? 疑惑啊?
short s1=1;
s1+=1;
作者:
王磊
时间:
2013-6-20 08:46
s1=s1+1;这个是一次+运算和一次=赋值运算,一共两次运算, 结果自动提升int型,而S1是short型,需要手动强转
是S1+=1;这个+=运算符是进行了一次运算,内部会自动提升并赋值。
作者:
shang1jk
时间:
2013-6-20 09:07
上面那段代码, 把int型赋给short型, 有没有进行类型转换, 所以通不过.
而下面那段用+=运算符的, 应该是+=操作内部有强制类型转换的过程,
往这儿看:
public class Test {
public static void main(String[] args) {
String str = "10";
int i = 1;
char c = 'a';
c+=i;
System.out.println(c); //输出字符'b'
i+=c;
System.out.println(i); //输出整型99
/*i+=str; //编译报错, 因为不能把String型强制类型转换成int型. cant cast String to int.
System.out.println(i);*/
}
}
复制代码
作者:
tpsu88
时间:
2013-6-20 09:33
short s1=1;
s1=s1+1; s1(short类型) = s1(short类型,在与int类型进行计算时,会提升到int类型) + 1(int类型)
得到的结果却又赋给 short类型,需要强制转换。
short s1=1;
s1+=1; 再运算的时候,内部会自动帮你转换!
作者:
280270738
时间:
2013-6-20 11:59
类型转换异常,因为1是int型,int型加上short型会自动提升为int类型,int类型再赋值给short类型就会报错了;
而下面的表达式是一次运算符,它不会有自动转型的过程,所以编译是可以通过的。
作者:
浩临天下
时间:
2013-6-20 13:44
short s1=1;
s1=(short) (s1+1);应该是这样!!
作者:
黎志文
时间:
2013-6-20 14:44
shang1jk 发表于 2013-6-20 09:07
上面那段代码, 把int型赋给short型, 有没有进行类型转换, 所以通不过.
而下面那段用+=运算符的, 应该是+= ...
弱弱地问一句,你是怎样将代码粘贴得这么工整的,为啥每次我一把代码粘贴上去,缩进就自动没有了,也无法使用tab键进行缩进,只能通过空格去缩进,每次缩进的结果还参差不齐。
作者:
小佛爷
时间:
2013-6-23 23:45
short s1=1;
这句代码中,s1是short型,1虽然是整数(整型),但是,它在赋值给s1时会自动判断在不在short型的范围内,由于1这个值是固定的,因此可以赋值。
s1=s1+1;
这句代码中,short和int运算时,会自动提升,结果是int型,这里还没有错;但是要将(s1+1)运算后的int型数据赋值给short型的s1,就可能会丢失精度。因此报错。(s1是个变化的值,提升一个整数是不确定的话,就会容易丢失精度)。
s1+=1;是+=内部先将1强制转化为short型,然后与short型的s1相加,就没错了。
作者:
梦想蓝色天空
时间:
2013-6-24 10:05
关于本题,楼上几位兄弟都说的差不多了。
我在这里说一下原理,我也是刚刚学习到的
Short 短整型 值范围为-32768到32767 他是16位的
Int 整型 =-2147483648 至2147483647 32位的
Long 长整型 值范围为=-9223372036854775808 他是64位的
所以小类型数据转换大类型数据的时候是自动转换的(装箱) 比如你题中的 s+1(这时候就是整数类型)
但再赋值为s(short类型)的时候 就必须要强制类型转换了(因为是大类型数据的转换小类型数据,也就是拆箱) 所以会报错
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2