C++ cout 行为/执行顺序

C++ cout behavior / order of execution

我正在看一些 example questions CPPInstitute 的 CPA-21-01 考试,对问题 #11 有点困惑。 它声明如下:

What is the output of the following program?

#include <iostream>

using namespace std;

class A {
public:
    A() {
        a.a = a.b = 1;
    }
    struct { int a,b; } a;
    int b(void);
};

int A::b(void)
{
    int x=a.a;
    a.a=a.b;
    a.b=x;
    return x;
}

int main(void) {
    A a;
    a.a.a = 0;
    a.b();
    cout << a.b() << a.a.b << endl;

    return 0;
}

A. The program will cause a compilation error

B. 10

C. 01

D. 11

可以归结为一个更小的例子:

int swap_and_return(int& a, int& b) {
    std::swap(a,b);
    return a;
}

int main() {

    int a = 0;
    int b = 1;

    cout << swap_and_return(a,b) << a << endl;

    return 0;
}

到目前为止一切顺利;答案是 B.

假设您选择 D。

根据this执行顺序任意:

15) In a function call, value computations and side effects of the initialization of every parameter are indeterminately sequenced with respect to value computations and side effects of any other parameter.

已经有类似问题here

我觉得cout行可以翻译成cout.operator<<(a.b()).operator<<(a.a.b);,意思是应该有一个序列点,行为应该是确定性的?

实践中得到如下结果:

MS cl.exe,调试:10

MS cl.exe,发布:11

GCC, C++11: 11

Clang: 11

不用说,我现在有点糊涂了,因为他们说这是答案B,当看起来执行顺序确实是任意的。

谁能解释一下我对执行顺序的看法是否正确以及它应该是什么?

谢谢!

在 C++17 之前,您是对的,并且该测验不允许正确答案。

从那时起,