Java中的++和 - 运算符的优先级

zw3*_*324 9 java increment prefix operator-precedence postfix-operator

我从Java的官方教程中读到前缀和后缀++ - 具有不同的优先级:

后缀:expr ++ expr--

一元:++ expr --expr + expr -expr~!

运营商

根据教程,不应该这样

d = 1; System.out.println(d++ + ++d);

打印6(d++使d 2,++d使它3)而不是4?

我知道++d事先评估的解释,但如果d++有更高的优先权++d,为什么不d++首先评估?更重要的是,在什么情况下应该d++表明它具有更高的优先级?

编辑:

我尝试了以下方法:

d = 1; System.out.println(++d * d++);

它返回4.它似乎应该是2*2,而不是1*3.

Kev*_*hou 14

println语句的内部是这个操作(d ++)+(++ d)

  1. 如下,读取d的值(d = 1)
  2. 将d(1)的当前值加入加法函数中
  3. d的值递增(d = 2).

  4. 然后,在右侧,读取d的值(2)

  5. d的值递增(现在d = 3)
  6. 最后,将d(3)的值放入加法函数中

    因此1 + 3导致4

编辑:抱歉格式,我很擅长使用列表哈哈


joe*_*ice 10

关键是从操作返回的内容.

  • x ++更改x的值,但返回旧的x.
  • ++ x更改x的值,并返回新值.
d=1
System.out.println(d++ + ++d); // d is 1
System.out.println(1 + ++d); // d is 2
System.out.println(1 + 3); // d is 3

打印4


Paŭ*_*ann 7

不同的优先权并不意味着将首先评估.

这意味着表达式将以这种方式分组.

在这种情况下,d++ + ++d将进行分组(d++) + (++d),并且将按以下顺序评估此二进制表达式:

  • 左操作数d++.此子表达式由后缀增量运算符和变量组成,因此它具有以下两种效果:
    • 子表达式的值是 1
    • 变量已更新: d = 2
  • 右操作数++d.此子表达式由前缀增量运算符和变量组成,因此它具有以下两种效果:
    • 变量已更新: d = 3
    • 子表达式的值是 3
  • +使用两个操作数的值评估运算符.
    • 因此表达值为1 + 3 = 4.

++只能看到前缀和后缀形式之间的不同优先级++d++,它将被解释为++(d++)- 并且这没有任何意义((++d)++也没有任何一个),因为++只适用于变量,而不是值(并且结果是值).