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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 隋营营 中级黑马   /  2012-5-2 14:38  /  2389 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 隋营营 于 2012-5-2 20:24 编辑

无意中发现一个奇怪的现象:
public class Testext {
        public static void main(String[] args){
                int i = 5;
                long j = 8;
                i += j;        // 编译正确
                i = (i + j); //编译错误,必须加强制转换:i = (int)(i + j);
        }
}
i = i + j; 与 i += j 应该是等价的吧?
谁能解释下原因……

6 个回复

倒序浏览
"+="的特殊之处: 内部自动实现了类型转换的步骤
回复 使用道具 举报
int i = 5;
long j = 8;
i += j;        // +=会先检测相加之后的和是否在int范围内,如果是赋值,+=运算会自动转换类型
i = (i + j); //  因为+法运算,i会自动类型提升为long类型,最后的结果是long无法赋值给int
回复 使用道具 举报
i += j; 如楼上所说,自动实现了转换步骤, i = (i + j); 这个不能实现
另外注意数字类型转换的时候尽量小类型转换为大类型  比如double转换float没问题  但是反过来可能就会出问题了哦
回复 使用道具 举报
i+=j只运算一次,他内部自动转换类型值
而i=(i+j)运算两次,他内部不会自动转换
回复 使用道具 举报
这里的 += 会自动的去实现类型的转换的.当发现这个类型 不一样的时候.
会自动的去将long的 j 转换成 int.
面在下面的  i + j . 根据运算,编译器会将i 自动的去向高级转换,
将int 类型的i 转换成long类型。然后就相当于是要将一个long类型的数字
赋值给一个int类型。这肯定是不可以的。
Java中支持自动向上转换但不支持自动向下转换。
谢谢!
回复 使用道具 举报
不能等价。i = i + j;因为i j 都是变量,相加后可能出现超出范围的情况。而i += j有一个类型自动向下转型的动作;只要确定了i  j相加不超出范围都不会报错。如查超出范围就会报错。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马