Una expresión como esta:
Tiene un resultado indefinido, explicando por partes:
1) Los puntos de secuencia. Salvo los operadores '&&', '||', ',' y '?:' el siguiente punto de secuencia se indica por el terminador de sentencia ';'. Un ejemplo:
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:
Y considerando lo anterior esta puede ser evaluada en cualquiera de las siguientes formas:
* 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:
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).
Un saludo
Código (c) [Seleccionar]
a[i] = i++;
Tiene un resultado indefinido, explicando por partes:
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 (c) [Seleccionar]
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 (c) [Seleccionar]
a[i] = i++;
(1) (2)
Y considerando lo anterior esta puede ser evaluada en cualquiera de las siguientes formas:
* 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 (c) [Seleccionar]
i = i++;
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).
Un saludo