2012-08-30 12 views
6

tuve una persona que afirma que esta línea no está cubierto por el estándar de C++:¿La matriz [i] = i ++ está cubierta por el estándar C++?

int i(1); 
array_of_int[i] = i++; 

La persona dijo que asignará 1 pero no podemos saber si será en array_of_int[1] o array_of_int[2] aunque el estudio visual y la mayoría de compiladores estará en array_of_int[1].

¿Está correcto?

+0

Según tengo entendido, este comportamiento lo determina el compilador y no se trata explícitamente en el estándar de C++ – CatShoes

+4

Posible dup: http://stackoverflow.com/questions/949433/could-anyone-explain-these-undefined-behaviors -iiiii-etc - esto está cubierto en una de las respuestas. – Mat

+0

Por favor cierre o elimine mi pregunta si es un engaño, traté de encontrar que se me preguntó pero no formulé mi búsqueda con las palabras clave correctas. – BlueTrin

Respuesta

6

Comportamiento no definido. Literalmente cualquier comportamiento es legal.

El pasaje que prohíbe esa línea de código es la siguiente:

Entre el anterior y el siguiente punto de la secuencia de un objeto tendrá su valor almacenado modificado como máximo una vez por la evaluación de una expresión. Además, el valor previa se de sólo lectura para determinar el valor a almacenar

No hay punto de secuencia entre a[i] y i++ y la lectura a i en a[i] está no con el propósito de determinar qué valor se almacena en i por i++.

+0

Gracias por la explicación, agregué un enlace a la página wiki de los puntos de secuencia – BlueTrin

+1

Los puntos de secuencia se han eliminado de C++ y se han reemplazado por la secuencia relaciones entre declaraciones/sub-expresiones. [ver aquí] (http://stackoverflow.com/a/10655884/365496). Esto cambia algunas instancias de comportamiento indefinido a un comportamiento bien definido, pero no en este caso particular. – bames53