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

时间:2011-06-16 14:58:23

标签: java increment prefix operator-precedence postfix-operator

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

  

postfix:expr ++ expr -

     

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

Operators

根据教程,不应该这个

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.

10 个答案:

答案 0 :(得分:13)

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

  7. 编辑:对不起格式,我很擅长使用列表哈哈

答案 1 :(得分: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

答案 2 :(得分:7)

不同的优先级并不意味将首先评估

这意味着表达式将被以这种方式

分组

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

  • 左操作数d++。该子表达式由一个后缀增量运算和可变的,所以它在这些两个方面的影响:
    • 子表达式的值为1
    • 变量已更新:d = 2
  • 右操作数++d。此子表达式由前缀增量运算符和变量组成,因此它具有以下两种效果:
    • 变量已更新:d = 3
    • 子表达式的值为3
  • 使用两个操作数的值评估operator +
    • 因此表达式值为1 + 3 = 4。

++的前缀和后缀形式之间的不同优先级只能在++d++中看到,它将被解释为++(d++) - 这没有任何意义({{1}因为(++d)++仅适用于变量,而不适用于值(结果是值),因此也没有任何人。

答案 3 :(得分:2)

这不是关于优先权,而是关于评估顺序。 d++评估为1,但随后d会递增。 ++d递增d,然后评估为3。

答案 4 :(得分:2)

请参阅Why is this Java operator precedence being ignored here?

归结为首先评估后缀运算符,但按设计返回变量的原始值。因此,出于操作目的:

(d++ + ++d)

Processes as:
1. d++ evaluates, returning the original value of 1 but incrementing d to 2
2. ++d evaluates, incrementing the value of 2 TO 3, and returning 3
3. +   evaluates, resulting in 1 + 3

对于要评估的令牌,混淆不是优先顺序,你已经做到了。真正的问题在于理解后缀和前缀运算符之间的功能差异。

答案 5 :(得分:0)

d的值为1

评估d ++;它的值是1,d现在是2(后++在增量前返回值)

++ d被评估;它的值是3,d现在是3(++在增量后返回值)

1 + 3 = 4

答案 6 :(得分:0)

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

这是怎么回事:

++ d被执行,所以d现在是2.

执行d + d,等于4。

值4被赋予System.out.println()

执行d ++,现在d为3。

答案 7 :(得分:0)

我经历了从顶部开始的所有解释。根据理解,下面的代码应该给出11.0然后y给出10.0 double x = 4.5; x = x + ++ x; // x得到值10.0。

答案 8 :(得分:-1)

除了其他评论之外,我建议你看看序列点,因为这些东西中的一些可能导致未定义的行为,但我认为你的案例是为java定义的。

x[i]=i++ + 1;做了什么?

http://www.angelikalanger.com/Articles/VSJ/SequencePoints/SequencePoints.html

答案 9 :(得分:-1)

这是一个常见的错误。即使在oracle认证指南中,他们也说Post增量和减量运算符的优先级高于Pre运算符。

我认为这是许多人一段时间以来所犯的错误。在尝试了几个表达式之后。我相信我可以自信地说前期和前期。邮政运营商具有相同的优先权,并从左到右进行评估。

您可以通过评估以下示例进行实验,以便自己确认。

int y = 4;
int x = --y * 2 + 3 + y-- * 2;      // x is 15

int y = 4;
int x = --y * 2 + 3 + y++ * 2;      // x is 15