Este é um comportamento indefinido?
arr[i++] += x; // [1]
// arr is an array of integer type and x is an integer type variable
// Assumptions -
// 1. Value of i is a valid index value of array arr and
// the result of prefix/postfix increment/decrement of i
// is also a valid index value of array arr.
// 2. The value of array members and variable x is such that
// arithmetic operation (+) does not result in overflow.
gcc
e clang
o compilador não fornece nenhuma mensagem de aviso na instrução [1]
, mas se eu substituir [1]
por esta instrução -
arr[i++] = arr[i++] + x; // [2]
eles emitem uma mensagem de alerta sobre esta afirmação, que é bastante óbvia -
gcc
compilador:
warning: operation on ‘i’ may be undefined [-Wsequence-point]
arr[i++] = arr[i++] + x;
clang
compilador:
warning: multiple unsequenced modifications to 'i' [-Wunsequenced]
arr[i++] = arr[i++] + x;