Es un comportamiento indefinido std::cin >> i >> ++i;
Estoy tratando de entender el orden de evaluación de expresiones en C++. Tengo los siguientes ejemplos:
int i = 0;
std::cin >> i >> i; //¿ES ESTO UN COMPORTAMIENTO INDEFINIDO?
Mi primera pregunta es si el fragmento mostrado anteriormente produce un comportamiento indefinido.
A continuación,
int i = 0;
std::cin >> i >> ++i; //¿ES ESTO UN COMPORTAMIENTO INDEFINIDO?
Mi segunda pregunta es si este fragmento produce un comportamiento indefinido.
davy.ai
Respuestas
Pregunta 1
Este fragmento de código no produce un comportamiento indefinido. El orden de evaluación del operador
>>
es de izquierda a derecha, por lo questd::cin >> i
se evalúa primero, seguido destd::cin >> i
. Es seguro realizar múltiples extracciones en el mismo objetostd::istream
sin causar un comportamiento indefinido.Pregunta 2
Este fragmento de código produce un comportamiento indefinido. El orden de evaluación del operador
>>
sigue siendo de izquierda a derecha, por lo questd::cin >> i
se evalúa primero, seguido de++i
. Sin embargo, el orden de evaluación de los operandos del operador>>
no está especificado. Es posible que++i
se evalúe primero, seguido destd::cin >> i
. Si eso sucede, el comportamiento es indefinido porquei
se modifica varias veces entre dos puntos de secuencia, lo cual no está permitido en C++.