Esta es una pregunta estúpida. :)"Leer" un preincremento de POD no produce un comportamiento indefinido. ¿Por qué exactamente?
[EDIT: estúpida o no, esto resultó ser una pregunta C++ peculiaridad, ver UPDATE_2]
supongamos que tenemos:
int a = 0; // line 1
int b = ++a; // line 2
¿Qué ocurre en la línea 2 es (nota, los números son sólo marcadores y no se especifica el orden exacto):
= [1: write result of (3) to result of (2)]
/\
[2: take "b" l-value] [3: convert result of (4) to an r-value ]
|
[4: take "a" l-value, "increment" and return it]
La "escritura" en (4) está "ordenada" antes de la "lectura" en (3), y dado que no hay puntos de secuencia entre, el efecto secundario no está garantizado antes (3) (también hay una "leer" dentro de (4) sí mismo, pero ordenó antes de "escribir", por lo que no produce UB).
Entonces, ¿dónde está el error en lo de arriba?
[UPDATE, dirigido a abogados secuencia de puntos no sazonados :)]
En otras palabras, el problema es:
Parece que hay una "competición" si la L- el efecto secundario de conversión de valor a valor ("lectura") o incremento ("escritura") tiene lugar primero.
En C, que daría una UB, de acuerdo con JTC1/SC22/WG14 N926 "Sequence Point Analysis" * (ver, por ejemplo, Ejemplo 5:
int x,y; (x=y) + x; // UB
).Nota que este no sería un caso debe postincremento ser utilizado desde (3) y (4) constituirá un solo [(3): tomar "a" l-valor, convertirlo a r-valor y devolver ese valor r] con el "escribir" efecto secundario retrasado hasta algún lugar antes de que el siguiente punto de la secuencia
_
(*) Esto se parece a la lógica sistemática más limpio para el tema dado por los miembros del Comité de Normas C99.
[UPDATE_2]
lección aprendida: no juzgar C++ por reglas C :)). Hice exactamente eso preguntándome por qué el N926 (que describe limpiamente el modo C99 de las cosas) "no era lo suficientemente claro" sobre el tema de los preincrementos que producen valores l.
Surge la pregunta, ¿cómo se podría construir un razonamiento similar para C++, ya que no existe uno, ya que incluso en el caso C simplemente interpretar el estándar es bastante difícil, y el estándar de lenguaje C++ es mucho más complicado y oscuro.
[UPDATE_3]
Hay una discusión frente a algunos temas de interés (al menos en el ~ nuevo medio) en "The undefinedness of a common expression.", más el asunto se trate en la gente del comité here (ver " 222. Puntos de secuencia y operadores de retorno lvalue ").
Hmm, interesante. El problema solo ocurre en C++, no en C (++ a en C no es un valor l). –
Gracias por la actualización, lo que hace que la pregunta sea más interesante.Aparentemente tampoco fui lo suficientemente experimentado como para adivinar por tu etiqueta 'C' que solo estabas después de las consideraciones de C++. –
@John Eso fue _my_ fault (y también la _inconsistency_ que conduce a la pregunta en sí, vea la actualización_2). – mlvljr