2011-05-20 9 views
15

Decir que tengo este código:¿Se garantiza por bitwise u orden de evaluación?

unsigned int func1(); 
unsigned int func2(); 
unsigned int func3(); 

unsigned int x = func1() | func2() | func3(); 

que C++ hace garantiza que func1() será llamado primero, y luego func2(), y luego func3()?

¿O al compilador se le permite llamar a las funciones en el orden en que se siente?

Además, ¿se permite al compilador implementar aquí una optimización de cortocircuito si así lo desea? (por ejemplo, si func1() devolvió ~ 0, ¿podría el compilador decidir no molestarse en llamar a func2() o func3(), porque sabe que sus valores de retorno no pueden afectar el valor asignado a x?

+4

No pertenece a la pregunta, sino a una respuesta ahora eliminada: ¿Tres votos a favor sin comentarios? Vamos chicos, compartan el conocimiento, no sean tontos. @Answerer: la primera parte de su respuesta es incorrecta, las subexpresiones se pueden evaluar en * cualquier orden *; esta es probablemente la razón por la que fueron vituperados. – GManNickG

Respuesta

17

No, no hay garantía de que orden las funciones serán llamados. A diferencia de ||, | no implica un punto de secuencia.

Todas las funciones en la expresión deben invocarse a menos que la implementación pueda determinar que no tienen efectos secundarios y puede determinar el resultado de la expresión sin llamar realmente a una de las funciones. La implementación puede hacer esto bajo la regla "como si" que permite a la implementación realizar cualquier optimización que no pueda ser observada o detectada por un programa conforme.

13

no cortocircuito Puede ejecutarse fuera de servicio.

"La dirección de evaluación no afecta los resultados de las expresiones que incluyen más de un operador de multiplicación (*), adición (+) o operador bit a bit (& | ^) en el mismo nivel."

+0

¿Qué estás citando allí? – ildjarn

+1

http://msdn.microsoft.com/en-us/library/2bxt6kc4.aspx –

+4

Eso es justo; solo cite su fuente la próxima vez. : -] – ildjarn

Cuestiones relacionadas