#c #undefined-behavior
#c #неопределенное поведение
Вопрос:
Отредактируйте, чтобы уточнить: я не спрашиваю о том, как работает последовательность. Этот вопрос не является дубликатом вопроса, для которого он был помечен как дубликат. Я уже понимаю, что x * x
это UB. Я спрашиваю о значении фразы «Порядок вычисления выражений слева направо».
Эта строка взята из книги Бьярне Страуструпа «A Tour of C «, 2-е издание.
Я бы ожидал, что это будет означать, что такие фрагменты, как int x=2;int y=x * x
, четко определены. Оценка слева направо означает, в моем понимании, что x
вычисляется первым (значение 2), x
вычисляется вторым (значение 4), а конечное значение y
равно 8
.
Но clang предупреждает о multiple unsequenced modifications to 'x'
, поэтому я думаю, что мое понимание того, что означает цитата Страуструпа, должно быть неправильным.
Кто-нибудь может объяснить, что он на самом деле имеет в виду?
Комментарии:
1. Вы не вызываете функцию в своем примере кода.
2. @NathanOliver , я отредактировал, чтобы объяснить, почему я не считаю, что этот вопрос является дубликатом.
3. Снова открыто. Все, что вы хотите знать, можно найти здесь: en.cppreference.com/w/cpp/language/eval_order
Ответ №1:
«Порядок выражений слева направо» означает, что int z = a / b * c;
сначала будет разделено a на b, а затем результат умножится на c . Результат будет отличаться от int z = a * c / b;
, потому что при целочисленном делении будут потеряны все дроби.
В математике «реального мира» два выражения были бы эквивалентны; в вычислениях целых чисел они не являются.
Комментарии:
1. Контрпример: сначала вычисляется
x y/z
,y/z
затем добавление. Поскольку в цитате не упоминается порядок операций, я не думаю, что это то, что имеется в виду.