黑马程序员技术交流社区

标题: 运算式问题 [打印本页]

作者: 张俊飞    时间: 2014-1-3 23:18
标题: 运算式问题
本帖最后由 张俊飞 于 2014-1-5 15:06 编辑

short s = 1; s = s + 1;为什么会出现错误
作者: @翱翔@    时间: 2014-1-3 23:29
short s = 1; s = s + 1;//这是类型转换问题,s是short类型 1在运算时默认是int类型,所以会报错。

作者: 未来希望    时间: 2014-1-3 23:58
本帖最后由 未来希望 于 2014-1-4 00:04 编辑

类型不一致 ,short s = 1;
s = (short) (s + 1);这样就可以了



作者: 净坛使者    时间: 2014-1-4 06:29
s是short类型 1在运算时默认是int类型改成s = (short) (s + 1),就可以了
作者: 其LovE斤    时间: 2014-1-4 09:01
本帖最后由 其LovE斤 于 2014-1-4 09:02 编辑

short s = 1; s = s + 1;
s = 1.这里的1 也是int类型的。编译器只要看到整数,就默认是int类型的。
首相1是常量,编译器会看“=”号右边的类型和左边是否存在转换的可能。这里可以转换
然后看“=”右边的数据是否在  左边类型的范围内,这里在。
编译器就会做一个自动转换动作,将1转换为short类型。
s = s + 1   
这里编译器会做两步操作
s+1.   1是int类型的,会将s自动向上提升,变为int型和 1相加
s = s + 1   
   但是 “=”右边的s是一个变量,它存的是内存地址。指向的是一片内存空间。不会判断是否存在转换可能。“=”右边是int  左边是 short。      int占4个字节  short占2个字节。左边放不下。报错,数据精度丢失。具体解决就是上面说的 强转            
作者: 程玉习    时间: 2014-1-4 09:27
在运算时 1 是int类型的,s是short类型的,直接进行加法运算时,需要需要把1强转为short类型的
即:s = (short)(s + 1);
用+=这个运算符时不需要强转,因为它会进行自动类型转换,即:s += 1;//是不会出现失去精度的
作者: XiaoS    时间: 2014-1-4 11:53
这是数据类型转换的问题。byte,short,char这三种数据类型的变量只要参与运算,就会自动提升为int型然后再参与运算;s=s+1表达式右边b是byte型变量,1默认也是int型,b+1的结果自然也是int型,但是b是个变量,它在参与加法运算时容易丢失精读,将右侧赋值给左边,就是说用int型给byte型赋值,必须进行强制类型转换,改成b=(byte)(b+1)或者写成b+=1(说明:“+=”运算符本身就有强制转换的操作)就不会出错了。
作者: XiaoS    时间: 2014-1-4 11:55
,这是数据类型转换的问题。byte,short,char这三种数据类型的变量只要参与运算,就会自动提升为int型然后再参与运算;s=s+1表达式右边b是byte型变量,1默认也是int型,b+1的结果自然也是int型,但是b是个变量,它在参与加法运算时容易丢失精读,将右侧赋值给左边,就是说用int型给byte型赋值,必须进行强制类型转换,改成b=(byte)(b+1)或者写成b+=1(说明:“+=”运算符本身就有强制转换的操作)就不会出错了。
作者: XiaoS    时间: 2014-1-4 11:57
不好意思,上面回复中的b写错了,应该是s
作者: 黑马IT学员    时间: 2014-1-4 17:01
这个明显是类型不匹配,出现了转换额异常
作者: lwx    时间: 2014-1-4 17:15
俩个值类型不同,需进行强制转换
作者: 马姗姗    时间: 2014-1-4 17:59
在运算的时候,默认为int型.
所以会报错.
想要运算,需要强转

short s = 1; s = s + 1;
把s=s+1;改为s+=1;就不会报错,因为+=内含有强转的意思




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