Я смотрел на примерные вопросы экзамена CPPInstitute's CPA-21-01, и меня немного смущает вопрос № 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
С.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) При вызове функции вычисления значений и побочные эффекты инициализации каждого параметра имеют неопределенную последовательность относительно вычислений значений и побочных эффектов любого другого параметра.
Подобный вопрос уже возникал. здесь
Я думаю, что строчка может быть переведена в cout.operator<<(a.b()).operator<<(a.a.b);
, то есть должна быть точка последовательности и поведение должно быть детерминированным?
На практике следующееполучены результаты:
MS cl.exe, отладка: 10
MS cl.exe, выпуск: 11
GCC, C ++ 11 : 11
Clang : 11
Излишне говорить, что я немного запутался, потому что они говорят, что это ответ B, когда кажется, что порядок исполнения действительно произвольный.
Может ли кто-нибудь объяснить, прав ли яt порядок выполнения и что тогда должно быть?
Спасибо!