黑马程序员技术交流社区

标题: short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? [打印本页]

作者: 李增强    时间: 2012-3-26 23:44
标题: short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
short s1 = 1; s1 = s1 + 1;会报类型转换异常,因为在java中整数的默认类型是int类型,而int类型在内存中占4个字节,而s1是short类型占两个字节的把4个字节的赋值给两个字节的会损失精度,报告异常
short s1 = 1; s1 += 1;编译正常,因为这个运算复合运算了,这句隐含一个意思是右边运算完成无论是什么类型都要强制转换到左边的short类型的,就相当于short=(short)(s1+1)。

作者: 李震 李震 李震    时间: 2012-3-26 23:53
  对于short s1=1;s1=s1+1;由于s1+1运算时会自动提升表达式的类型,所以会自动提升表达式的类型,所以结果是INT型,在复制给short类型s1时,编译器将报告需要强制转换类型的错误。
short s1=1;s1+=1;由于+=是java语言规定运算符,java编译器会对她进行特殊处理,因此可以编译。
作者: 邓飞飞    时间: 2012-3-27 06:51
public class  Demo
{
    public static void main(String[] args)
        {
             short s1=1;//定义了一个short类型的变量并初始化为1,在这儿要明确的short类型在内存中占两个字节
             s1=s1+1;//1在java中默认的是int类型的,在内存中占4个字节。当jvm执行(s1+1)时会把结果自动提
                                               升为int类型,这是在赋给变s1时就出错了,因为数据类型不匹配。可以做强制类型转换s1=short(s1+1)

         }
}
public class Demo1
{
   public static void main(String[] args)
    {
        short s1=1;
        s1+=1;//在这儿是没有错误的,因为+=是一个特殊的赋值运算符,自动完成运算、类型转换和赋值
     }
}
作者: 尹丽峰    时间: 2012-3-27 13:12
s1=s1+1 运算两次 先运算s1+1然后赋给 s1 ,但是s1+1 因为精度向上变化 所以s1+1 已经变成了int型, 而s1 是short型,iint占4字节 short 占1个字节,肯定要丢失精度,而s1+=1,是因为 s1+=1,是进行一次赋值运算 自动转换类型!
作者: 李见黎    时间: 2012-3-27 13:18
1. short s1 = 1; s1 = s1 + 1; s1+1运算结果是int型,需要强制转换类型2. short s1 = 1; s1 += 1;(可以正确编译)




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