C COUT行为 /执行顺序

C++ cout behavior / order of execution

本文关键字:执行 顺序 行为 COUT      更新时间:2023-10-16

我正在研究Cppinstitute CPA-21-01考试的一些示例问题,并且对问题11的问题有些困惑。它说明以下内容:

以下程序的输出是什么?

#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。该程序将导致汇编错误

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。

据此,执行顺序是任意的:

15)在函数调用中,每个参数的初始化的价值计算和副作用都对任何其他参数的价值计算和副作用进行了不确定的测序。

这里已经有一个类似的问题

我认为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之前,您是对的,测验不允许正确答案。

从那时起,答案是确定性的。