的定义+=
在 Java 和 C++ 中似乎相同,但是它们的执行方式不同。
考虑以下 C++ 代码:
#include <iostream>
int n;
int f(int x) {
n += x;
return x;
}
int main() {
n = 0;
n = n + f(3);
std::cout<<n<<" ";
n = 0;
n += f(3);
std::cout<<n<<" ";
n = 0;
n = f(3) + n;
std::cout<<n<<std::endl;
}
这输出:3 6 6
Java 输出中的类似代码:3 3 6
,这是供参考的代码。
static int n;
public static void main(String[] args) {
n = 0;
n = n + f(3);
System.out.println(n);
n = 0;
n += f(3);
System.out.println(n);
n = 0;
n = f(3) + n;
System.out.println(n);
}
public static int f(int x) {
n += x;
return x;
}
C++:
E1 op= E2(其中 E1 是可修改的左值表达式,E2 是右值表达式或花括号初始化列表(C++11 起))与表达式 E1 = E1 op E2 的行为完全相同,除了表达式 E1 只计算一次,并且对于不确定顺序的函数调用,它表现为单个操作
爪哇:
E1 op= E2 形式的复合赋值表达式等价于 E1 = (T) ((E1) op (E2)),其中 T 是 E1 的类型,除了 E1 只计算一次。
出于好奇,我在 Python 中检查了这个,它的输出与 Java 相同。当然,编写这样的代码是非常糟糕的做法,但我仍然对解释感到好奇。
我怀疑+=
不同语言的变量评估方式的顺序是不同的,但我不知道具体如何。我在定义中遗漏了什么,如何评估复合赋值运算符?