Что подразумевается под «порядком вычисления выражений слева направо». - PullRequest
0 голосов
/ 24 апреля 2019

Изменить, чтобы уточнить: Я не спрашиваю о том, как работает секвенирование .Этот вопрос не является дубликатом вопроса, который был помечен как дубликат.Я уже понимаю, что x++ * ++x это UB.Я спрашиваю о значении фразы «Порядок вычисления выражений слева направо».

Эта строка взята из книги Бьярна Страуструпа «Путешествие по С ++», 2-е издание.

Я ожидал бы, что это будет означать, что фрагменты типа int x=2;int y=x++ * ++x четко определены.Оценка слева направо означает, в моем понимании, что x++ оценивается первым (значение 2), ++x оценивается вторым (значение 4), а окончательное значение y равно 8.

Но Clang предупреждает о multiple unsequenced modifications to 'x', поэтому я думаю, что мое понимание значения цитаты Страуструпа должно быть неверным.

Кто-нибудь может объяснить, что он на самом деле имеет в виду?

1 Ответ

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

«Порядок выражений слева направо» означает, что int z = a / b * c; будет сначала разделить a на b, а затем умножит результат на c.Это будет иметь иной результат, чем int z = a * c / b;, потому что целочисленное деление потеряет все дроби.

В математике «реального мира» оба выражения будут эквивалентны;в целочисленных вычислениях это не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...