C ++ cout странное поведение с пользовательским классом стека - PullRequest
3 голосов
/ 01 марта 2011

У меня есть собственный класс стека. Большую часть кода можно увидеть здесь:
Функции-члены шаблонного класса, принимающие тип шаблона в качестве аргумента

Я заполняю стек так:

stack <int> Astack;
Astack.Push(1); Astack.Push(2); Astack.Push(3); Astack.Push(4);

Тогда я делаю это:

cout << Astack.Pop() << Astack.Pop() << Astack.Pop() << Astack.Pop() <<endl;

и получите это: 1234
Однако, если я сделаю это:

cout << Astack.Pop(); cout << Astack.Pop(); cout << Astack.Pop(); cout << Astack.Pop();

Я получил это: 4321, что, очевидно, то, что я хочу.

Итак, что дает?

Ответы [ 3 ]

7 голосов
/ 01 марта 2011

Порядок оценки вызовов функций не указан. Ваше первое выражение в основном сводится к следующему:

cout << a << b << c << d;

Каждый из a, b, c и d является вызовом Astack.Pop(). Компилятор может генерировать код, который оценивает эти вызовы в любом порядке, который он выберет.

Вам следует избегать написания выражений, которые основаны на определенном порядке вычисления частей выражения. В общем, это небезопасно (и даже когда это безопасно, это обычно довольно запутанно).

1 голос
/ 01 марта 2011

Существует нечто, известное как неуказанное поведение, определенное стандартом ISO C ++. Ваш фрагмент кода является лишь примером этого.

1 голос
/ 01 марта 2011

В первой версии аргументы cout оцениваются справа налево.Вы никогда не указываете, в каком порядке они должны оцениваться, поэтому сначала оценивается тот, который справа, выдается 4 и т. Д.

...