有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

为什么Java的+=、=、*=、/=复合赋值运算符不需要强制转换?

直到今天,我还以为例如:

i += j;

这只是一条捷径:

i = i + j;

但如果我们尝试这样做:

int i = 5;
long j = 8;

然后i = i + j;将不会编译,但i += j;将编译良好

这是否意味着实际上i += j;是这样的一种捷径 i = (type of i) (i + j)


共 (6) 个答案

  1. # 1 楼答案

    与这些问题一样,JLS始终掌握着答案。在这种情况下§15.26.2 Compound Assignment Operators。摘录:

    A compound assignment expression of the form E1 op= E2 is equivalent to E1 = (T)((E1) op (E2)), where T is the type of E1, except that E1 is evaluated only once.

    引自§15.26.2的一个例子

    [...] the following code is correct:

    short x = 3;
    x += 4.6;
    

    and results in x having the value 7 because it is equivalent to:

    short x = 3;
    x = (short)(x + 4.6);
    

    换句话说,你的假设是正确的

  2. # 2 楼答案

    i = i + l的情况下,需要从long强制转换为int{},然后它将编译并给出正确的输出。像

    i = i + (int)l;
    

    i = (int)((long)i + l); // this is what happens in case of += , dont need (long) casting since upper casting is done implicitly.
    

    但是在+=的情况下,它工作得很好,因为操作符隐式地执行从右变量类型到左变量类型的类型转换,所以不需要显式转换

  3. # 3 楼答案

    这里的问题涉及类型转换

    当您添加int和long时

    1. int对象被强制转换为long&;这两个对象都被添加,您将获得长对象
    2. 但long对象不能隐式转换为int。所以,必须显式转换

    但是+=的编码方式是它进行类型转换i=(int)(i+m)

  4. # 4 楼答案

    基本上当我们写作的时候

    i += l; 
    

    编译器将其转换为

    i = (int)(i + l);
    

    我刚刚检查了.class文件代码

    知道真是件好事

  5. # 5 楼答案

    很好的问题。报告确认了你的建议

    For example, the following code is correct:

    short x = 3;
    x += 4.6;
    

    and results in x having the value 7 because it is equivalent to:

    short x = 3;
    x = (short)(x + 4.6);
    
  6. # 6 楼答案

    这种类型转换的一个很好的例子是使用*=或/=

    byte b = 10;
    b *= 5.7;
    System.out.println(b); // prints 57
    

    byte b = 100;
    b /= 2.5;
    System.out.println(b); // prints 40
    

    char ch = '0';
    ch *= 1.1;
    System.out.println(ch); // prints '4'
    

    char ch = 'A';
    ch *= 1.5;
    System.out.println(ch); // prints 'a'