С++ std::cout и оператор ‹‹, приоритет

У меня есть такой код:

std::cout << " a: " << classDate.getDays() << " b: " << classDate++ << " c: " << classDate.getDays();

Я перегрузил оператор постинкремента.

в классе переменная m_days имеет значение:

  • перед оператором ++ - 4
  • после++ опратор -5

Мой вопрос в том, почему результаты cout находятся в неправильном порядке:

a: 5 b: 5 c: 4

Я проверил это в отладчике, значения в классе верны. Когда я написал такой код:

std::cout << " a: " << classDate.getDays();
std::cout << " b: " << classDate++;
std::cout << " c: " << classDate.getDays();

все правильно (а:4 б:5 в:5).

Это проблема приоритета оператора?

Камиль


person e2p    schedule 09.12.2013    source источник
comment
Я не уверен, как вы получаете b: 5, когда используете постинкремент. Это точный код, который вы используете?   -  person David Brown    schedule 10.12.2013
comment
Прости, я забыл. post-increment возвращает новое значение как целое число.   -  person e2p    schedule 10.12.2013
comment
@kolumb Тогда вы внедрили префикс ++ и назвали его постфиксом. Будущим сопровождающим вашего кода будет, по крайней мере, трудно это понять.   -  person Mark B    schedule 10.12.2013


Ответы (3)


Порядок оценки не определен.

Взгляните на этот ответ, отличное объяснение этого тип результата

person Marcassin    schedule 09.12.2013

В C++ порядок оценки аргументов функции (а перегруженный operator<<, используемый здесь, является просто функцией) не определен, поэтому компилятор может свободно оценивать classDate++, а также каждый classDate.getDays() в любом порядке, который он выбирает. Таким образом, с разными компиляторами или разными параметрами компиляции вы можете получить любой из

a: 4 b: 5 c: 4
a: 4 b: 5 c: 5
a: 5 b: 5 c: 4
a: 5 b: 5 c: 5

Если вы хотите, чтобы они оценивались в определенном порядке, вы должны поместить выходные данные в отдельные операторы, как во втором примере.

person David Brown    schedule 09.12.2013

Я предполагаю, что оператор ++ на самом деле вызывает побочный эффект, который гарантированно имеет место после точки последовательности (см. http://en.wikipedia.org/wiki/Sequence_point и Неопределенное поведение и точки последовательности).

До достижения точки последовательности это зависит от компилятора, когда выражение оценивается. Таким образом, вы не можете полагаться на порядок оценки вашего выражения.

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

person lwi    schedule 09.12.2013