java中的+= 如下面的程序class Test{ public static void main(String args[]) { short s=1; s=s+1; s+=1; }}中s=s+1不对,但s+=1却可以通过,为什么? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 s=s+1;首先将计算结果自动转换成int型的数据了。 +=之类的运算符隐含强制转换。 s+=1; == s=(short)s+1; s = (short)(s + 1); 我是这样理解的:“1”这个常量,编译器在处理的时候是有一定智能性的,可以根据上下文,把它理解成“int 常量”或者是“short 常量”。对于“赋值运算符(=)”,编译器按照被赋值变量的类型来理解“1”的类型;对于“累加赋值运算符(+=)”也是这样处理。所以语法上就没有问题了(不需要强制转换)。对于“加法运算符(+)”,编译器总是把“1”当作“int 常量”来理解,所以 s+1 的结果是一个“int 型值”,所以 s=s+1 就需要强制转换了。 s为short型, 经过s+1之后自动转化为int型了,应改强制转化为s = (short)(s + 1);就可以了! s=s+1 s是short 1是int所以报错s+=1 是强制转换成int s=(short) (s+1);这么写就对了 同意imA(男的不会,会的不男)的說 只要看看jvm指令就可以很容易理解了:public class Test { public static void main(String[] args) { short a = 1; a += 1; }}它对应的jvm代码如下:0: iconst_1 //将int型常量1加载到操作栈(即short a = 1;中的1)1: istore_1 //将操作栈中的值存储到变量(即存储到变量a中,a完成了初始化)2: iload_1 //将变量(即a)的值加载到操作栈3: iconst_1 //将int型常量1加载到操作栈(即 a += 1;中的1)4: iadd //将操作栈中的两个值相加5: i2s //将结果转换为short6: istore_1 //将结果存储到变量(即存储到变量a中,a完成了运算)7: return //方法结束返回。第5行的代码执行了一个强制向下转型。 其中第2行:iload_1 在加载变量的时候执行了一个隐式向上转型(short-->int) 第4行:执行的是两个int型的加法运算。所以第5行:要向下转型。 小弟初学java四个月,第一次自主的写的俄罗斯方块小游戏 java swing 双缓冲 XYLayout实现的是什么布局啊?哪里有他的用法介绍?加分! 求THINKING IN JAVA 4 从文件读取工资信息,输出时按工资降序排列该怎么做呢? 文件改名为什么会失败? 关于java.io.IOException的疑问 急,急,急,请教简单问题,我用java.net.URL 去连接一个http,为什么总是不成功?? 大家帮我看看,闷ing!!! file 加入jstl方法的问题 如何将int数组中得值保存为一个文件,然后再一个一个从文件中读去出来保存到一个新数组中
s+=1;
==
s=(short)s+1;
这么写就对了
public class Test { public static void main(String[] args) {
short a = 1;
a += 1;
}}
它对应的jvm代码如下:
0: iconst_1 //将int型常量1加载到操作栈(即short a = 1;中的1)
1: istore_1 //将操作栈中的值存储到变量(即存储到变量a中,a完成了初始化)
2: iload_1 //将变量(即a)的值加载到操作栈
3: iconst_1 //将int型常量1加载到操作栈(即 a += 1;中的1)
4: iadd //将操作栈中的两个值相加
5: i2s //将结果转换为short
6: istore_1 //将结果存储到变量(即存储到变量a中,a完成了运算)
7: return //方法结束返回。
第5行的代码执行了一个强制向下转型。
第4行:执行的是两个int型的加法运算。
所以第5行:要向下转型。