请问为什么 x line 是对的但 y line 是错的[code=Java]
[public class Test
{
public static void main(String[] args)
{
//short s1=1;s1=s1+1; // x line
short s1=1;s1+=1; // y line
}}/code]
[public class Test
{
public static void main(String[] args)
{
//short s1=1;s1=s1+1; // x line
short s1=1;s1+=1; // y line
}}/code]
其次这可能是运算符的要求。
s1+1
s1是short型
1是int型
所以两个加完后是类型加大的那个,int但是s1=s1+1;赋值的时候,s1是short型,不能将int型隐式转换成short
如果要转只能显示转换s1=(short)(s1+1);
两个short想加呢?
s1=s1+1; // x line 错,需要类型转换 short + int short 要先扩充为 int 再相加(变为大数再相加减),结果为 int
s1+=1; // y line 对, += 相当于 s1= (short) s1+1;
呵呵,跟着企鹅走...
运算的时候,byte short int 都应该转换成int再进行运算吧。
我这样认为的
首先
short s1=1;
s1=s1+1;
上面这段代码中 s1+1 的计算
编译器会这样判断 :任意长度小于等于int的两个数(不管是byte,short,int)相加得到的结果总是int 型
所以s1=s1+1; 中int 赋值给short 显然编译不让通过
下面这段代码
short s1=1;s1+=1;
这里+=,*=,-= 这些符合实际上使用的是隐式强制转换
即先(short)s1+1;
然后在赋给s1 所以这样可以通过.
因为1是int型的,而s1是short的,两者相加成为int 型,而你设置的s1是short型,所以出错~
强制转换 s1=(short)(s1+1)后面的s1+=1,已经隐式的进行了强制转换·在eclipse中,你这样定义 short s1= 1 ;
它就会提示出语法错误·
short可以转换int,但是int转short要强制转换
[public class Test
{
public static void main(String[] args)
{
//short s1=1;s1=s1+1; // x line
short s1=1;s1+=1; // y line
}}/code]
是x行是错的吧,y行才是对的。s1=s1+1;首先会自动提升s1的类型为int,int类型是不能直接赋给short类型的,要强制转换。而s1+=1相当于赋值语句short s1=1;都是直接对其赋值,所以至始至终都是short类型。