Рассмотрим следующее выражение (с объявлением для демонстрации):
int n = 42;
--n &= 0x01;
Это нарушает правила последовательности?
На мой взгляд, предварительное приращение необходимо как часть «вычисления значения» левого операнда. Если это так, то UB здесь не существует, начиная с C ++ 11 (а, начиная с C ++ 17, оба вычисления значений и побочные эффекты упорядочены относительно назначения).
Если бы это был пост-инкремент, то модификация n
была бы просто побочным эффектом, и у нас не было бы хорошей последовательности (до C ++ 17).