2012-08-23 17 views
7

Duplicar posibles:
cout << order of call to functions it prints?
Undefined Behavior and Sequence Pointsoperador de precedencia

¿Por qué este código de impresión 2 1 0?

#include <iostream> 
struct A{ 
    int p; 
    A():p(0){} 
    int get(){ 
    return p++; 
    } 
}; 


int main(){ 
A a; 
std::cout<<a.get()<<" "<<a.get()<<" "<<a.get()<<std::endl; 
} 
+2

No hay punto de secuencia ... §6.2.2 __El orden de evaluación de las subexpresiones dentro de una expresión no está definido .__ – oldrinb

+0

Gracias, esta parece ser la razón, confirmado en http://stackoverflow.com/questions/ 3463261/operator-precedence-for-and-in-vs2008-with-optimization? Rq = 1 Responde tu comentario, lo marcaré como final –

+0

He publicado mi comentario como respuesta :-) – oldrinb

Respuesta

4

Como dije en my comment, no tiene sentido secuencia ...

Según §6.2.2 de BS de El C++ Programming Language, Tercera Edición ...

El orden de evaluación de las subexpresiones dentro de una expresión no está definido. En particular, no puede suponer que la expresión se evalúa de izquierda a derecha.

§ 5,4 de los C++ 03 previsto por la norma:

Excepto donde se indique, el orden de evaluación de los operandos de los operadores y subexpresiones de expresiones individuales individuales, y el orden en que los efectos secundarios tener lugar, no se especifica. Entre el punto de secuencia anterior y siguiente, un objeto escalar tendrá su valor almacenado modificado como máximo una vez por la evaluación de una expresión.

Puede obtener más información acerca de los puntos de secuencia y el comportamiento indefinido here.

+2

¿Dónde está? tu cita viene? Miré en C++ 03, C++ 11, C90, C99 y C11 y ninguno tiene un 6.2.2 con ese contenido. Por cierto, C++ 03 en 5/4 dice "Excepto donde se indique, el orden de evaluación de operandos de operadores individuales y subexpresiones de expresiones individuales , y el orden en que se producen los efectos secundarios, es ** no especificado **." (y la versión que estoy usando tiene una marca de cambio de C++ 98, por lo que probablemente no haya cambiado). La diferencia con ** undefined ** es que el código tiene que proporcionar uno de varios resultados y puede que no comience a lanzar una flota de daemons fuera de su nariz. – AProgrammer

+0

Stroustrup * El lenguaje de programación C++ *, particularmente la 3ª edición. *** El orden de evaluación de las subexpresiones dentro de una expresión no está definido. En particular, no puede suponer que la expresión se evalúa de izquierda a derecha. *** – oldrinb

+0

Por cierto, no creo que su punto acerca de la diferencia entre * no especificado * y * indefinido * en este contexto tenga algún peso, dado un orden de evaluación * indefinido * entre los puntos de secuencia solo significa que se puede hacer sin embargo, el entorno desea que se haga, es decir, el mismo que * no especificado *. El orden no especificado genera un comportamiento indefinido :-) – oldrinb

Cuestiones relacionadas