A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 蒋珍珍 于 2014-3-12 12:06 编辑

下面两条语句:short s=3; s+=1;//为什么第二句能够编译运行都正确?而s+=1;这个语句编译却失败,这两条语句有什么区别吗,不都是关于数据类型的自动提升吗

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

7 个回复

倒序浏览
楼主你题目都没描述清楚{:3_47:}
   对于short s1 = 1; s1 = s1 + 1; 由于s1+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s1时,编译器将报告需要强制转换类型的错误。


     对于short s1 = 1; s1 += 1;由于 += 是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。


PS:数据类型的转换
java的数据类型在定义时已经确定了,因此不能随意转换成其他类型的数据类型,但java允许用户有限度的做类型转换处理。
java会在下列条件都成立时,自动做数据转换类型
1 转换前的数据类型与转换后的类型兼容
2 转换后的数据类型的表示范围比转换前的类型大
{:3_48:}

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报 1 0
short s=3,s=s+1,这句话是将一个int 型的数据和一个short类型的数据进行运算后会,得到的结果也会是int型,,然后赋值给一个short类型的变量,这个编译不会通过的, 而+=这个运算符系统会自动完成类型的提升。

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
centian2005 发表于 2014-3-10 18:03
楼主你题目都没描述清楚
   对于short s1 = 1; s1 = s1 + 1; 由于s1+1运算时会自动提升表达式的类 ...

该题正解啊,描述比较到位
回复 使用道具 举报
楼主能把题目说清楚一点吗?不太明白要表达什么?关于类型提升?
  1. class  Test_1
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 short s=3;
  6.                 s+=1;
  7.                
  8.                 System.out.println(s);
  9.         }
  10. }
复制代码

像上边写的这个肯定是正确的,但是如果你直接写
  1. s+=1;
复制代码

这肯定不对啊。

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
各位大神解释的太详细了,偶懂啦,
对于short s1 = 1; s1 += 1;由于 += 是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。
而+=这个运算符系统会自动完成类型的提升。

并且因为表达式最终的类型是由最后一个运算符决定的,而复合赋值运算+=是不会改变最终结果的数据类型。
short s=3;
s+=1;
"+="为复合赋值运算符,运算后没有改变变量s的数据类型,它的类型仍为short,所以编译运行正确
而如果写成s=s+s;的话,编译失败就是因为+运算时把结果类型提升为了int的,而int类型的值是不能直接赋给short类型的s的。

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
+=这个运算符系统会自动完成类型的提升,“+=1”的结果返回是一个int类型的值,然后又将int型的值赋给short型的变量s,所以会编译出错。
回复 使用道具 举报
无此姓名 发表于 2014-3-10 22:27
楼主能把题目说清楚一点吗?不太明白要表达什么?关于类型提升?

像上边写的这个肯定是正确的,但是如果你 ...

没理解好 题意  centian2005 正解
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马