Java '的操作员层次结构组织+=';和'++';?

Java '的操作员层次结构组织+=';和'++';?,java,operators,Java,Operators,我对下面的短代码片段有点困惑,为什么结果不是4,而是3 int i = 1; i += ++i; System.out.println(i); 我想的是: 计算右侧,++i,i为2 计算+=,i=i+2,此时,我认为i现在应该是4,但结果是3 详情如下: Java编程语言保证 运算符似乎按特定的求值顺序求值, 即从左到右 计算右侧+i 不,这不是第一步 第一步是计算左侧的原始值。然后评估右侧。求和,并将结果分配给变量 所以 大致相当于 i = i + (++i); 特别是,我的重点: 否则

我对下面的短代码片段有点困惑,为什么结果不是4,而是3

int i = 1;
i += ++i;
System.out.println(i);
我想的是:

  • 计算右侧,
    ++i
    i
    为2
  • 计算
    +=
    i=i+2
    ,此时,我认为
    i
    现在应该是4,但结果是3
  • 详情如下:

    Java编程语言保证 运算符似乎按特定的求值顺序求值, 即从左到右

    计算右侧+i

    不,这不是第一步

    第一步是计算左侧的原始值。然后评估右侧。求和,并将结果分配给变量

    所以

    大致相当于

    i = i + (++i);
    
    特别是,我的重点:

    • 否则,保存左侧操作数的值,然后计算右侧操作数的值。如果此计算突然完成,则赋值表达式也会因为相同的原因突然完成,并且不会发生赋值

    • 否则,左侧变量的保存值和右侧操作数的值将用于执行复合赋值运算符指示的二进制运算。如果此操作突然完成,则赋值表达式出于相同的原因突然完成,并且不会发生赋值


    我觉得++运算符的优先级比+=,为什么不先做++运算?@WenhuCao:优先级是关于分组的。它的优先性意味着
    a+b*c
    被视为
    a+(b*c)
    ,而不是
    (a+b)*c
    ——但是
    a
    仍将首先计算。好的,让我消化一下。。。无论如何,非常感谢:)
    i += ++i;
    
    i = i + (++i);