Lógico Y, O: ¿Está garantizada la evaluación de izquierda a derecha?

¿Está garantizada la evaluación de izquierda a derecha de los operadores lógicos ( && || )?

Digamos que tengo esto:

 SDL_Event event; if (SDL_PollEvent(&event)) { if (event.type == SDL_QUIT) { // do stuff } } 

¿Se garantiza que esto sea lo mismo que esto?

 SDL_Event event; if (SDL_PollEvent(&event) && event.type == SDL_QUIT) { // do stuff } 

Esto también puede ser muy importante, digamos que tenemos dos requisitos, a y b . Requisito a es mucho más probable que falle b . Entonces es más eficiente decir if (a && b) que if (b && a) .

Sí, está garantizado, de lo contrario, dichos operadores perderían gran parte de su utilidad.

Aviso importante : esto es válido solo para el builtin && y || ; si algún delincuente los sobrecarga, se los trata como operadores binarios sobrecargados “normales”, por lo que en este caso ambos operandos siempre se evalúan y en un orden no especificado como es habitual. Por esta razón, nunca los sobrecargue: rompe una suposición muy importante sobre el flujo de control del progtwig.


Citas estándar relevantes

Builtin && y || tener un comportamiento garantizado de cortocircuito

§5.14 ¶1

A diferencia de & , && garantiza la evaluación de izquierda a derecha: el segundo operando no se evalúa si el primer operando es false .

§5.15 ¶1

A diferencia de | , || garantiza la evaluación de izquierda a derecha; además, el segundo operando no se evalúa si el primer operando se evalúa como true .

Si están sobrecargados, se comportan como operadores binarios “normales” (sin cortocircuito u orden garantizada de evaluación)

§13.5 ¶9

Los operadores no mencionados explícitamente en las subcláusulas 13.5.3 a 13.5.7 actúan como operadores ordinarios unarios y binarios que obedecen las reglas de 13.5.1 o 13.5.2.

y && y || no se mencionan explícitamente en estas subcláusulas, así que el §13.5.2 regular contiene:

§13.5.2 ¶1

Un operador binario se implementará mediante una función miembro no estática (9.3) con un parámetro o mediante una función no miembro con dos parámetros. Por lo tanto, para cualquier operador binario @ , x@y se puede interpretar como x.operator@(y) u operator@(x,y) .

sin una disposición especial para evaluar solo un lado o en un orden particular.

(todas las citas del estándar C ++ 11)