C ++ cout行为/执行顺序

问题描述 投票:2回答:1

我正在看CPPInstitute的CPA-21-01考试的一些example questions,对于问题#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.

根据this,执行顺序是任意的:

15)在函数调用中,关于任何其他参数的值计算和副作用,每个参数的初始化的值计算和副作用是不确定的。

已经有类似的问题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++ cout sequence-points
1个回答
4
投票

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

从那时起,the answer is deterministic

© www.soinside.com 2019 - 2024. All rights reserved.