operator online c++ logical-operators order-of-evaluation

c++ - online - operator precedence java



Y lógico, O: ¿Se garantiza la evaluación de izquierda a derecha? (1)

¿Se garantiza 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, b . El requisito a es mucho más probable que falle, entonces b . Entonces es más eficiente decir if (a && b) que if (b && a) .


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

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

Citas estándar relevantes

Builtin && y || tener garantizado el comportamiento 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 "regulares" (no hay cortocircuito ni se garantiza el orden de evaluación)

§13.5 ¶9

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

y && y || no se mencionan explícitamente en estas subcláusulas, por lo que la §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 puede interpretarse como x.operator@(y) o operator@(x,y) .

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

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