我正在看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似乎确实是任意的执行顺序。
任何人都可以解释一下我对执行命令的正确性吗?
谢谢!