[Примечание: Операторы могут быть перегруппированы в соответствии с обычными математическим правилам только там, где операторы действительно являются ассоциативными или коммутативными.7 Например, в следующем фрагменте int a, b;
/∗ ... ∗/
a = a + 32760 + b + 5;
выражение оператор ведет себя точно так же, как и
a = (((a + 32760) + b) + 5);
благодаря ассоциативности и приоритете этих операторов. Таким образом, результат суммы (a + 32760) затем добавляется к b, и этот результат равен , а затем добавляется к 5, что приводит к значению, присвоенному a. На машине , в котором переливается произвести исключение, и в котором диапазон значений, изображаемых с помощью Int является [-32768 + 32767], реализация не может переписать это выражение, как
a = ((a + b) + 32765);
, так как, если значения для a и b были соответственно -32754 и -15, сумма a + b создавала исключение, тогда как исходное выражение не было бы; не может выражение быть переписано либо как
a = ((a + 32765) + b);
или
a = (a + (b + 32765));
, так как значения для а и б, возможно, были, соответственно, 4 и -8 или -17 и 12. Тем не менее на машина, в которой переполнения не производят исключение и в котором результаты переполнения обратимы, выражение выражения выражения выражения может быть переписано реализацией в любым из указанных способов, поскольку тот же результат будет иметь место. - end note]
Насколько я понимаю, поскольку добавление лево-ассоциативное, переупорядочение в вашем примере не допускается. –
На самом деле вы не видите целочисленное переполнение, потому что вы добавляете значения 'uint32_t', которые не переполняются, они завершаются. Это не разные виды поведения. –
См. Раздел 1.9 стандартов C++, он напрямую отвечает на ваш вопрос (есть даже пример, который почти точно совпадает с вашим). – Holt