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

时间:2015-09-17 05:26:44

标签: java c++ variable-assignment assignment-operator

这是在我解决“破解编码”采访时发生的事情。问题:

  

编写一个函数来交换一个数字(即没有临时变量)

我决定用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 == 7b == 5

现在这里有趣的部分。

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

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

1 个答案:

答案 0 :(得分:5)

查看Java Language Specification, section 15.7 (Evaluation Order)

  

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

因此,在Java中,评估顺序是明确定义的,并且符合您的期望。

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

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

  

如果对标量对象的副作用相对于值没有排序   使用相同标量对象的值进行计算,行为是   未定义。