Jur*_*uba 5 c++ java variable-assignment assignment-operator
这是在我处理"Cracking the Coding interview"问题时发生的:
编写一个函数来交换一个数字(即没有临时变量)
我决定用Java编写我的解决方案(因为我计划在实习面试中使用Java.)
我提出了一个解决方案,我几乎确信这是正确的答案(因为我在一行中做到了):
public static void main(String args[]) {
int a = 5;
int b = 7;
a = b - a + (b = a);
System.out.println("a: " + a + " b: " + b);
}
Run Code Online (Sandbox Code Playgroud)
当然,这段代码可以执行所需的结果.a == 7和b == 5.
现在这是有趣的部分.
这段代码不会在C++中运行,也不是本书后面的解决方案.
所以我的问题是:为什么我的解决方案确实有效?我假设Java的做法与其他语言有所不同?
Java编程语言保证运算符的操作数似乎以特定的评估顺序进行评估,即从左到右.
所以在Java中,评估顺序是明确定义的,并且符合您的期望.
C++规范没有提供这样的保证; 实际上它是未定义的行为,所以程序可以完全做任何事情.
引用cppreference,注意到对算术运算符的操作数排序没有排序规则:
如果相对于使用相同标量对象的值的值计算,标量对象的副作用未被排序,则行为未定义.