黑马程序员技术交流社区

标题: +=进阶问题 [打印本页]

作者: 王亚东    时间: 2013-3-7 18:42
标题: +=进阶问题
本帖最后由 王亚东 于 2013-3-8 13:20 编辑
  1. class Demo02
  2. {
  3.     public static void main(String[] args)
  4.     {
  5.             int i=5;               
  6.             //i=i+5.0;// 这句话相当于 i = (double)i+5.0; 5.0是double类型,i是int类型,他们运算时,int会转为double
  7.             i+=5.0;//这里相当于:i = i+(int)5.0; +=是赋值运算符,就是把double强制转为int赋给i
  8.             System.out.println(i);
  9.     }
  10. }
复制代码
上面是我回答别人的问题的代码,但是后来看到有人对第二句的解释我的理解不一样,说是:
i+=5.0 相当于 i=(int)(i+5.0),虽然感觉二者没什么区别,但还是觉得第一种解释更准确点,大家觉得对吗?
作者: 黄基焜    时间: 2013-3-7 19:01
感觉
i = i+(int)5.0比i=(int)(i+5.0)高效一点,
i = i+(int)5.0,只转型了一次,5.0从double转成int;
i=(int)(i+5.0),转型了两次,i+5.0转成double,再强转成int
作者: 张卫刚    时间: 2013-3-7 19:14
楼上回答的很好,我只想说要把//i=i+5.0;改成 i=(int)(i+5.0);要不编译通不过
class Demo02
{
    public static void main(String[] args)
    {
            int i=5;               
           //i=i+5.0;// 这句话相当于 i = (double)i+5.0; 5.0是double类型,i是int类型,他们运算时,int会转为double
            i+=5.0;//这里相当于:i = i+(int)5.0; +=是赋值运算符,就是把double强制转为int赋给i
            System.out.println(i);
    }
}


作者: 崔龙飞    时间: 2013-3-8 00:36
张卫刚 发表于 2013-3-7 19:14
楼上回答的很好,我只想说要把//i=i+5.0;改成 i=(int)(i+5.0);要不编译通不过
class Demo02
{

i+=5.0;//这里相当于:i = i+(int)5.0; +=是赋值运算符,就是把double强制转为int赋给i


我原本以为:
i +=5.0;//先把 i 转换成double类型,与5.0做运算后的结果为double型,再自动强制转换成 int 类型.原来+=不遵循由小向大转换的规律,而是强制转换成定义的类型。
还好过来逛了逛论坛。
多谢
作者: amen0205    时间: 2013-3-8 02:13
你执行  i=i+5.0;会发生错误吧    i会自动升为double类型 和 5.0完成运算后  可不会自动转成int   需要强制转换   i=(int)(i+5.0);   但你要是执行 i = i+(int)5.0;效率更好

i+=5.0;  这里+=是一次运算符  先提升i到double  再和5.0相加   再转成int  再赋值给 i  都算成是一步运算  程序自动强转  是OK的





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