Historia de la pregunta:
Los operadores lógicos && y || se introducen en C para comprobar condiciones lógicas complejas. La característica de su funcionamiento es el soporte para la evaluación de cortocircuito: el segundo operando no se evalúa si el resultado se puede determinar de manera concluyente a partir del primero.
Problema:
Muchos programadores esperan que ambos operandos siempre se evalúen, o utilizan incorrectamente los efectos secundarios en el segundo operando, asumiendo que necesariamente se ejecutará. En la práctica, esto lleva a errores, filtraciones de recursos y comportamientos inesperados.
Solución:
Entender el mecanismo de la evaluación de cortocircuito ayuda a construir construcciones seguras, especialmente en comprobaciones de punteros, recursos y archivos. El uso de efectos secundarios en la parte derecha de la expresión solo debe hacerse de manera consciente. Ejemplo de una comprobación segura:
if (ptr && ptr->field) { /* ... */ }
Características clave:
¿Se ejecutará la expresión f() en el fragmento: if (0 && f())?
No, la función f() no se llamará, porque el resultado ya es claro: la expresión es falsa, y la evaluación adicional es innecesaria.
¿Y en la siguiente declaración: if (1 || f())?
De nuevo, f() no se llamará: el resultado ya es verdadero después del primer operando.
¿Se pueden usar los operadores && y || para controlar el orden de ejecución de funciones con efectos secundarios?
Técnicamente, es posible, pero tal control lleva a código ilegible e inestable. Es mejor detallar explícitamente el orden de las llamadas a funciones, sin depender del comportamiento de cortocircuito para los efectos secundarios.
if (flag || process()) { // ... }
El proceso nunca se llamará si flag es verdadero.
Pros:
Contras:
if (!flag) process();
Pros:
Contras: