Desde el principio, en el lenguaje C, se permitió omitir las llaves para un solo operador dentro de la construcción if. Esto hizo el código más compacto, pero provocó numerosos errores no evidentes, especialmente durante la expansión y modificación. La razón histórica es el ahorro de espacio y la simplicidad de la sintaxis para casos minimalistas.
El problema surge cuando el desarrollador olvida que sin llaves if solo controla la primera expresión después de él: todas las siguientes se ejecutan incondicionalmente, incluso si visualmente parece no ser obvio. Este estilo lleva a errores ocultos que son difíciles de identificar al leer el código y a la aparición de errores debido a la tabulación olvidada o la adición de nuevas líneas.
La solución es siempre usar llaves, incluso si solo hay un operador. Esto mejora la legibilidad y la seguridad del código.
Ejemplo de código:
// Malo: if (x > 0) do_something(); do_other(); // Se ejecuta siempre // Mejor: if (x > 0) { do_something(); do_other(); }
Características clave:
¿Afecta la indentación (tabulador/espacio) al ámbito de if?
No, en el lenguaje C el ámbito se define solo por las llaves, no por la indentación.
¿Cuál será el comportamiento de dicho código?
if (a > 0) fun1(); fun2();
fun1() se llamará solo si a > 0. fun2() siempre se llamará independientemente de la condición.
¿Cuáles son las consecuencias de olvidar agregar llaves al agregar una nueva línea?
Este código puede cambiar el comportamiento y llevar a errores que son difíciles de detectar visualmente, ya que la indentación no protege de errores de compilación.
El desarrollador agregó un segundo operador en un if de una línea, olvidando agregar llaves.
if (user) initialize(); log_access();
Ventajas:
Desventajas:
El desarrollador siempre usa llaves incluso para un solo operador:
if (user) { initialize(); log_access(); }
Ventajas:
Desventajas: