Código
Tiene un resultado indefinido, explicando por partes:
a[i] = i++;
1) Los puntos de secuencia. Salvo los operadores '&&', '||', ',' y '?:' el siguiente punto de secuencia se indica por el terminador de sentencia ';'. Un ejemplo:
Código
alguna_expresion (1); /* (1) marca el siguiente punto de secuencia */
2) Todo efecto lateral (por ejemplo el generado por los operadores unarios ++ y --) se aplicara en algún momento antes del siguiente punto de secuencia.
3) Dada la mentada expresión:
Código
Y considerando lo anterior esta puede ser evaluada en cualquiera de las siguientes formas:
a[i] = i++; (1) (2)
* La expresión (2) se evalúa primero, a continuación aplica el efecto lateral y por ultimo se evalúa (1).
* La expresión (2) se evalúa primero, a continuación se evalúa (1) y por ultimo aplica el efecto lateral.
* La expresión (1) se evalúa primero, a continuación se evalúa (2) y por ultimo aplica el efecto lateral.
Cualquiera que suceda es valida (y por ello la recomendación de evitar expresiones cuyo resultado es indefinido).
----
Otra historia son expresiones del tipo:
Código
Estas son ilegales ya que se modifica un objeto (en este caso la variable "i") en mas de una ocasión entre puntos de secuencia (la asignación mas el efecto lateral).
i = i++;
Un saludo