C ++ Cout поведение / порядок исполнения - PullRequest
0 голосов
/ 24 февраля 2019

Я смотрел на примерные вопросы экзамена 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 порядок выполнения и что тогда должно быть?

Спасибо!

1 Ответ

0 голосов
/ 24 февраля 2019

До C ++ 17 вы правы, и тест не позволяет получить правильный ответ.

С тех пор ответ является детерминированным .

...