这是在我解决“破解编码”采访时发生的事情。问题:
编写一个函数来交换一个数字(即没有临时变量)
我决定用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);
}
当然,此代码执行所需的结果。 a == 7
和b == 5
。
现在这里有趣的部分。
这段代码不会在C ++中运行,也不是本书后面的解决方案。
所以我的问题是:为什么我的解决方案确实有效?我假设Java的做法与其他语言不同?
答案 0 :(得分:5)
查看Java Language Specification, section 15.7 (Evaluation Order):
Java编程语言保证了操作数 运算符似乎在特定的评估顺序中进行评估, 即,从左到右。
因此,在Java中,评估顺序是明确定义的,并且符合您的期望。
C ++规范并没有提供这样的保证;实际上它是未定义的行为,所以程序可以做任何事情。
从cppreference引用,注意到对算术运算符的操作数排序没有排序规则:
如果对标量对象的副作用相对于值没有排序 使用相同标量对象的值进行计算,行为是 未定义。