Страницы

Поиск по вопросам

пятница, 12 июля 2019 г.

Проблемы с вывод при компиляцией под х86

Есть простая функция которая возводит число в куб.
double refcube(double &x) { x *= x * x; return x; }
К примеру double x = 3.0, то на экран мне выведет 27 = 3
std::cout << refcube(x)<< " = " << x << std::endl;
Если я изменю вывод сделав его таким
std::cout << refcube(x); std::cout << " = " << x << std::endl;
то выведет измененное значение переменной x, то есть 27 = 27
При компиляции под x64 такой проблемы нет.
С чем это может быть связано?
P.S система x64


Ответ

Это может быть связано с версией вашего компилятора и поддерживаемого им стандарта языка.
Начиная со стандарта С++17 языка С++ левая часть оператора << целиком и полностью вычисляется до правой части. Этот код
std::cout << refcube(x) << " = " << x << std::endl;
должен выводить 27 = 27
В более ранних версиях языка выводится может и 27 = 3 и 27 = 27. Поведение не специфицировано.
Как только вы разбиваете это выражение на два отдельных выражения, неоднозначность исчезает во всех версиях спецификации. Вывод должен быть 27 = 27

Комментариев нет:

Отправить комментарий