Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Regla 0x100Ah: Prohibición de estructuras de control con cuerpo vacío (if (...);)

Estructuras de control y flujo (0x10XX)

Universidad Nacional de Río Negro

0x100Ah: Prohibición de estructuras de control con cuerpo vacío (if (...);)

Enunciado normativo

NO DEBE colarse un punto y coma inmediatamente después de la condición de un if, while, for o switch cuando se pretende que las sentencias siguientes formen el cuerpo. Toda estructura de control DEBE tener un cuerpo explícito delimitado con llaves (ver 0x1001h: Todas las estructuras de control deben utilizar llaves).

¿Por qué existe esta regla?

El problema

El punto y coma es una sentencia vacía válida en C. Escrito tras la condición de un if o un while, se convierte en el cuerpo de esa estructura. Las sentencias que siguen, aunque estén indentadas, quedan fuera del control y se ejecutan sin condición.

El error es de una sola tecla y el compilador no lo denuncia: el programa compila y hace algo, solo que distinto de lo que el autor cree. Es una de las causas más frecuentes de “funciona a veces” en las entregas iniciales.

Consecuencias de violarla

Tipo de consecuenciaEfecto concreto
Bug lógico graveEl bloque se ejecuta siempre, haya o no cumplido la condición.
Lazo infinitowhile (cond); gira para siempre sin cambiar el estado.
LegibilidadLa indentación miente sobre qué pertenece al control.
MantenibilidadUn lector desprevenido “arregla” el código moviendo llaves.

Fundamento en el estándar y en la cátedra

ISO/IEC 9899:2011 §6.8.3 define la sentencia nula como una sentencia válida, y §6.8.4.1 asocia el cuerpo del if a la sentencia inmediata. La cátedra prohíbe el cuerpo nulo como señal de error lógico y exige llaves, lo que deja el error a la vista. Se complementa con 0x1001h: Todas las estructuras de control deben utilizar llaves y con 0x1009h: Prohibición de asignaciones simples dentro de condiciones lógicas.

Alcance y excepciones

Ejemplos exhaustivos

❌ Contraejemplo 1 — if con ; accidental

if (x > 0);
{
    procesar(x);
}

Por qué falla: el if tiene como cuerpo la sentencia vacía; el bloque entre llaves se ejecuta siempre. El programa procesa x incluso cuando no debería.

❌ Contraejemplo 2 — while con cuerpo nulo

while (leer_caracter() != '\n');

Por qué falla: el lazo consume caracteres hasta el fin de línea, pero eso no es lo que el lector entiende a simple vista. Si leer_caracter tiene un efecto lateral, el código depende de él y lo oculta.

✅ Ejemplo conforme 1 — llaves y cuerpo explícito

if (x > 0)
{
    procesar(x);
}

El cuerpo está delimitado y la llave elimina toda posibilidad de una sentencia nula intermedia.

✅ Ejemplo conforme 2 — consumo deliberado y documentado

while (leer_caracter() != '\n')
{
    // se descarta el resto de la linea
}

Aunque el cuerpo no haga nada, las llaves y el comentario declaran que el consumo es intencional; no hay punto y coma huérfano.

⚠️ Casos límite

Cómo detectarla

HerramientaComandoSeñal
gaffgaff check archivo.cRegla 0x100Ah: cuerpo vacío.
gccgcc -Wall -Wextra -Wempty-bodywarning: suggest braces around empty body.
Revisión manualCondición que termina en ; seguida de un bloque.

Checklist de autocontrol

Reglas relacionadas