Expressions and statements
ES.43
Избегайте выражений с неопределённым порядком вычислений
Причина
Вы не можете знать, что делает такой код. Переносимость. Даже если он делает что-то разумное для вас, это может сделать что-то другое на другом компиляторе (например, следующей версии вашего компилятора) или с другими настройками оптимизатора.
Примечание
C++17 ужесточает правила порядка вычислений: слева направо, кроме присваиваний (справа налево), а порядок вычисления аргументов функции по-прежнему не определён.
Однако помните, что ваш код может быть скомпилирован компилятором, предшествующим C++17 (например, через копирование-вставку), поэтому не будьте слишком хитрыми.
Пример
v[i] = ++i; // результат не определён
Хорошее правило большого пальца: не следует читать значение дважды в выражении, в которое вы в него записываете.
Контроль
Может быть обнаружен хорошим анализатором.