我正在查看CPPInstitute的CPA-21-01考试的一些示例问题,但对第11题有点困惑。
它陈述如下:
到目前为止还不错;答案键说是B。
假设你选择了D。
根据this,执行顺序是任意的:
15)在函数调用中,每个参数的值计算和初始化的副作用与任何其他参数的值计算和副作用的顺序不确定。
已经有一个类似的问题here 我认为cout行可以翻译成
实际上,得到以下结果:
MS cl.exe,Debug:10
MS cl.exe,Release:11 GCC,C++11: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;
}
这个程序会导致编译错误。
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,Debug:10
MS cl.exe,Release:11 GCC,C++11:11
Clang:11
不用说,我现在有点困惑了,因为他们说答案是B,但实际上执行顺序似乎是任意的。
请问有人能解释一下我关于执行顺序的看法是否正确,以及应该是什么顺序吗?
谢谢!