Java赋值运算符行为与C++

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 == 7b == 5.

现在这是有趣的部分.

这段代码不会在C++中运行,也不是本书后面的解决方案.

所以我的问题是:为什么我的解决方案确实有效?我假设Java的做法与其他语言有所不同?

Erw*_*idt 5

查看Java语言规范,第15.7节(评估顺序):

Java编程语言保证运算符的操作数似乎以特定的评估顺序进行评估,即从左到右.

所以在Java中,评估顺序是明确定义的,并且符合您的期望.

C++规范没有提供这样的保证; 实际上它是未定义的行为,所以程序可以完全做任何事情.

引用cppreference,注意到对算术运算符的操作数排序没有排序规则:

如果相对于使用相同标量对象的值的值计算,标量对象的副作用未被排序,则行为未定义.

  • 相反,"如果相对于使用相同标量对象的值的值计算,标量对象的副作用未被排序,则行为未定义." ([cppreference](http://en.cppreference.com/w/cpp/language/eval_order)),注意到对算术运算符的操作数排序没有排序规则. (2认同)