我正在看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 ++ 17之前,你是对的,测验不允许正确的答案。