gpt4 book ai didi

Java执行算术表达式错误?

转载 作者:行者123 更新时间:2023-12-01 07:07:15 24 4
gpt4 key购买 nike

我不明白Java是如何处理这个算术表达式的

int x = 1;
int y = 1;
x += y += x += y;
System.out.println("x=" + x + " y=" + y);

使用 Java,我得到 x = 4 和 y = 3。但是在 C、Perl、Php 中,我得到 x=5 和 y = 3在纸上我还得到 x = 5 和 y = 3

最佳答案

这显然是令人讨厌的部分:

x += y += x += y;

执行如下:

int originalX = x; // Used later
x = x + y; // Right-most x += y
y = y + x; // Result of "x += y" is the value stored in x
x = originalX + y; // Result of "y += x" is the value stored in y

所以:

                     x      y
(Start) 1 1
x = x + y 2 1
y = y + x 2 3
x = originalX + y 4 3

重要的部分是这里使用了originalX。复合赋值被视为:

x = x + y

并且 + 的第一个操作数第二个操作数之前求值...这就是为什么它采用 原始 值>x,不是“最新”的。

来自JLS section 15.16.2 :

If the left-hand operand expression is not an array access expression, then:

  • First, the left-hand operand is evaluated to produce a variable. If this evaluation completes abruptly, then the assignment expression completes abruptly for the same reason; the right-hand operand is not evaluated and no assignment occurs.

  • Otherwise, the value of the left-hand operand is saved and then the right-hand operand is evaluated. If this evaluation completes abruptly, then the assignment expression completes abruptly for the same reason and no assignment occurs.

如有疑问,请查阅语言规范 - 切勿仅仅因为两种语言的行为不同而认为其中一种语言是“错误的”。只要实际行为与每种语言的指定行为相匹配,一切都很好 - 当然,这确实意味着您需要了解您使用的每种语言的行为。

也就是说,您首先应该明确避免这样的可怕代码。

关于Java执行算术表达式错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21485283/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com