【发布时间】:2015-12-13 21:32:20
【问题描述】:
这发生在我处理“破解编码面试”问题时:
编写一个函数来就地交换一个数字(即没有临时变量)
我决定用 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 做的事情与其他语言不同?
【问题讨论】:
-
我认为 (b = a) 在 C++ 中不会返回任何内容。或者我错了,我不懂 C++。
-
@Sweeper
b = a被评估为左值b,具有赋值的副作用。 -
@Sweeper 作为表达式,它产生分配的值.. 但是,C/C++ 有序列点的“有趣”问题,因此存在未定义的行为。在 Java 中,它是定义的行为,尽管“对我来说太聪明了”。
-
搜索并阅读序列点(我也推荐this evaluation-order reference)。
标签: java c++ variable-assignment assignment-operator