11

我从 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。

4

9 回答 9

16

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

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

于 2011-06-16T15:02:27.353 回答
12

关键是操作返回的内容。

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

打印 4

于 2011-06-16T15:03:33.247 回答
8

不同的优先级并不意味着会先被评估

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

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

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

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

于 2011-06-16T15:08:01.560 回答
2

这与优先级无关,而与评估顺序有关。 d++计算结果为1,但随后d递增。 ++d递增d,然后计算为 3。

于 2011-06-16T15:03:45.897 回答
2

请参阅为什么此处忽略此 Java 运算符优先级?.

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

(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

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

于 2011-06-16T15:07:21.100 回答
0

d 的值为 1

d++ 被评估;它的值是 1,现在 d 是 2(post++ 在递增之前返回值)

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

1 + 3 = 4

于 2011-06-16T15:04:30.463 回答
0

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

事情是这样的:

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

d + d 被执行,等于 4。

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

d++ 被执行,所以现在 d 是 3。

于 2011-06-16T15:05:52.397 回答
0

我从顶部浏览了所有解释..根据理解以下代码应该给出 11.0 然后 y 它给出 10.0 double x = 4.5; x = x + + + x; // x 得到值 10.0。

于 2013-09-29T15:19:34.127 回答
-1

除了其他评论之外,我建议您查看序列点,因为其中一些内容可能会导致未定义的行为,尽管我认为您的案例是为 java.util 定义的。

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

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

于 2011-06-16T15:06:51.540 回答