C ++ cout行为/执行顺序

时间:2019-02-24 18:37:24

标签: c++ cout sequence-points

我正在看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.operator<<(a.b()).operator<<(a.a.b);,这意味着应该有一个序列点,并且行为应该是确定性的?

实际上,可获得以下结果:

MS cl.exe,调试:10

MS cl.exe,版本:11

GCC, C++11:11

Clang:11

不用说,我现在有点困惑,因为他们说答案B似乎确实是任意的执行顺序。

任何人都可以解释一下我对执行命令的正确性吗?

谢谢!

1 个答案:

答案 0 :(得分:4)

在使用C ++ 17之前,您是对的,测验不允许给出正确的答案。

此后,the answer is deterministic