C++ cout 行为/执行顺序
C++ cout behavior / order of execution
我正在看一些 example questions CPPInstitute 的 CPA-21-01 考试,对问题 #11 有点困惑。
它声明如下:
What is the output of the following program?
#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. The program will cause a compilation error
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) In a function call, value computations and side effects of the initialization of every parameter are indeterminately sequenced with respect to value computations and side effects of any other parameter.
已经有类似问题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 之前,您是对的,并且该测验不允许正确答案。
从那时起,。
我正在看一些 example questions CPPInstitute 的 CPA-21-01 考试,对问题 #11 有点困惑。 它声明如下:
What is the output of the following program?
#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. The program will cause a compilation error
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) In a function call, value computations and side effects of the initialization of every parameter are indeterminately sequenced with respect to value computations and side effects of any other parameter.
已经有类似问题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 之前,您是对的,并且该测验不允许正确答案。
从那时起,