Задать вопрос
evgeniy8705
@evgeniy8705
Повелитель вселенной

Почему выводится другое значение вместо ожидаемого?

Подскажите почему value выводится равное 14 а не 13?

#include <iostream>

inline double square(double x) { return x * x; }

int main()
{
	double value = 13.0;

	std::cout << "value = " << value << ", squared = " << square(value++) << std::endl; // value = 14, squared = 169

	return 0;
}
  • Вопрос задан
  • 106 просмотров
Подписаться 2 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
HighTechLowLife
@HighTechLowLife
https://en.cppreference.com/w/cpp/language/eval_order

2) If a side effect on a memory location is unsequenced relative to a value computation using the value of any object in the same memory location, the behavior is undefined.

cout << i << i++; // undefined behavior until C++17
a[i] = i++;       // undefined behavior until C++17
n = ++i + i;      // undefined behavior
Ответ написан
Комментировать
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Очевидно, потому что оператор value++ (вместе с square) выполнился раньше оператора сдвига <<, которые используются для вывода в поток cout.

Вообще, у меня оно выводит 13.

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

Вообще, использование переменной value в том же выражении, что и она же с постинкриментом - Undefined behavior.

Мне лень искать конкретные пункты стандарта, из которых будет следовать, что это UB, но просто запомните: нельзя использовать перменную и переменную++ в одном и том же выражении.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы