Что подразумевается под «Порядком вычисления выражений слева направо».

#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 затем добавление. Поскольку в цитате не упоминается порядок операций, я не думаю, что это то, что имеется в виду.