Regla 0x0011h: Validador de espaciado estricto en sentencias de control
Sintaxis y formato visual (0x00XX)
0x0011h: Validador de espaciado estricto en sentencias de control¶
Enunciado normativo¶
DEBE existir exactamente un espacio en blanco entre las palabras clave
if,for,whileyswitchy el paréntesis de apertura de su condición:if (x),for (...),while (...),switch (op). NO DEBE escribirseif(...)niwhile (...).
¿Por qué existe esta regla?¶
El problema¶
if, while, for y switch son palabras clave: el compilador las reconoce
por el lexema, no por el paréntesis, de modo que if(x) y if (x) generan el
mismo código objeto. La regla no previene un error de traducción, sino una
ambigüedad visual: al pegar la palabra clave al paréntesis, la sentencia se
parece a una llamada a función y refuerza la idea errónea de que if “es una
función”. Separar con un espacio mantiene visible la frontera.
Consecuencias de violarla¶
| Tipo de consecuencia | Efecto concreto |
|---|---|
| Legibilidad | if(x) se confunde con una llamada; el lector pierde el tiempo clasificando el token. |
| Consistencia | Conviven if ( y if( en el mismo archivo, lo que rompe el estilo uniforme. |
| Semántica | Ninguna: el código compila y ejecuta igual. |
| Revisión | gaff lo detecta y lo corrige automáticamente; no hay excusa para dejarlo. |
Fundamento en el estándar y en la cátedra¶
ISO/IEC 9899:2011 §6.8.4 y §6.8.5 definen la gramática; el espacio sólo separa
tokens y no cambia el significado. Por eso la norma es convencional, y la
cátedra la adopta porque gaff la aplica de forma uniforme y porque distinguir
palabra clave de llamada es parte de la alfabetización en C. Se articula con
0x0003h: Un espacio antes y después de cada operador binario y con 0x000Fh: Prohibición de múltiples espacios en blanco consecutivos dentro de una línea de código.
Alcance y excepciones¶
Aplica a if, else if, for, while y switch. No aplica a sizeof,
que es un operador y se escribe sizeof(x) sin espacio, ni a return, cuya
forma está cubierta por 0x200Fh: Prohibición de paréntesis superfluos en sentencia return. do no lleva paréntesis. El código
generado automáticamente y no editado a mano queda exceptuado, pero debe
regenerarse con el formato correcto si se versiona.
Ejemplos exhaustivos¶
❌ Contraejemplo 1 — Palabra clave pegada al paréntesis¶
if(x > 0) {
return 1;
}Por qué falla: if( imita la sintaxis de una llamada y es exactamente lo que la
regla prohíbe; gaff fix insertaría el espacio faltante.
❌ Contraejemplo 2 — Espacios múltiples y omisión mezclados¶
while (i < n) {
i++;
}
switch(opcion) {
default:
break;
}Por qué falla: while ( lleva dos espacios —también viola 0x000Fh: Prohibición de múltiples espacios en blanco consecutivos dentro de una línea de código— y
switch( no lleva ninguno. La inconsistencia dentro del mismo bloque es la
señal de que nadie pasó el formateador.
✅ Ejemplo conforme 1 — Sentencia simple¶
if (x > 0) {
return 1;
}Por qué cumple: hay un único espacio entre if y (, el operador binario lleva
sus espacios (0x0003h: Un espacio antes y después de cada operador binario) y no hay blancos internos junto a los paréntesis
(0x000Eh: Prohibición de espacios en blanco internos inmediatamente tras ‘(’ o antes de ‘)’).
✅ Ejemplo conforme 2 — Interacción entre estructuras de control¶
for (size_t i = 0; i < n; i++) {
if (valores[i] > maximo) {
maximo = valores[i];
}
}
while (j > 0 && resto == 0) {
j /= 2;
}
switch (modo) {
case MODO_RAPIDO:
avanzar();
break;
default:
break;
}Por qué cumple: cada palabra clave está separada por exactamente un espacio, no se pegan llamadas al operador y las comas siguen 0x0015h: Validador de espaciado en listas de argumentos y llamadas a funciones.
⚠️ Casos límite¶
sizeof(x): es operador, no estructura de control; el espacio no va.Asignación en la condición:
if ((x = f()) != 0)tiene bien el espaciado pero viola 0x1012h: Prohibición de expresiones de asignación dentro de estructuras de control; son reglas independientes.else if (x): elifinterno se rige por esta regla.Macros que expanden a
if(: sortean el verificador; además redefinir sintaxis viola 0x500Dh: Prohibición de redefinir palabras clave o tipos primitivos de C con #define.
Cómo detectarla¶
| Herramienta | Comando | Señal |
|---|---|---|
gaff | gaff check archivo.c | Marca la falta de espacio o el exceso entre palabra clave y (. |
gaff | gaff fix archivo.c | Inserta el único espacio canónico. |
gcc / clang | gcc -Wall -Wextra -std=c11 -c archivo.c | No reporta nada: es una regla de estilo, no semántica. |
Checklist de autocontrol¶
Después de
if,for,whileyswitchhay exactamente un espacio.No dejé dos o más espacios en ningún punto de la línea (0x000Fh: Prohibición de múltiples espacios en blanco consecutivos dentro de una línea de código).
No confundí
sizeofcon una estructura de control.Pasé
gaff fixantes de entregar para no depender de la memoria.
Reglas relacionadas¶
0x0003h: Un espacio antes y después de cada operador binario — espacios alrededor de operadores binarios y tras la palabra clave.
0x000Eh: Prohibición de espacios en blanco internos inmediatamente tras ‘(’ o antes de ‘)’ — prohibición de espacios internos tras
(o antes de).0x000Fh: Prohibición de múltiples espacios en blanco consecutivos dentro de una línea de código — prohibición de espacios múltiples consecutivos.
0x0015h: Validador de espaciado en listas de argumentos y llamadas a funciones — espaciado de las comas en los argumentos del
for.0x1012h: Prohibición de expresiones de asignación dentro de estructuras de control — asignación embebida en la condición, prohibida por separado.