Является ли (a = 1) = 2 неопределенным поведением в C ++ 98? - PullRequest
5 голосов
/ 01 апреля 2020

Аналогичные коды, например, (a+=1)%=7;, где a - это переменная int.

Мы знаем, что оператор += или = не является точкой последовательности, поэтому у нас есть два побочных эффекта между двумя соседними точками последовательности. (здесь используются правила точек последовательности cpp98)

Однако операторы присваивания, такие как += или =, гарантируют возвращение lvalue после присваивания , что означает, что порядок выполнения некоторая степень «определена».

Так это неопределенное поведение?

1 Ответ

5 голосов
/ 01 апреля 2020

(a=1)=2 не был определен до C ++ 11, так как оператор = не вводил точку последовательности и, следовательно, a изменяется дважды без промежуточной точки последовательности. То же самое относится к (a+=1)%=7

Текст был:

Между предыдущей и следующей точкой последовательности скалярному объекту должно быть сохранено его значение, измененное не более одного раза путем оценки выражение.

Стоит отметить, что описание оператора присваивания является дефектным:

Результатом операции присваивания является значение, сохраненное в левом операнде после присваивания произошло; результатом является lvalue.

Если результатом является lvalue, то результатом не может быть сохраненное значение (это будет r-значением). L-значения обозначают ячейки памяти. Это предложение, кажется, подразумевает отношение порядка, но независимо от того, как мы хотим его интерпретировать, оно не использует термин «точка последовательности», и поэтому применяется более ранний текст о точках последовательности.

Во всяком случае, эта формулировка вызывает сомнения в выражениях типа (a=1) + 2. Пересмотр секвенирования в C ++ 11 исправил все эти двусмысленности.

...