Regla 0x0003h: Un espacio antes y después de cada operador binario
Sintaxis y formato visual (0x00XX)
0x0003h: Un espacio antes y después de cada operador binario¶
Enunciado normativo¶
DEBE dejarse exactamente un espacio en blanco antes y después de cada operador binario y entre una palabra clave de control y su paréntesis (
if (,for (,while (,switch (). NO DEBE pegarse un operador binario a sus operandos.
La regla rige operadores aritméticos, relacionales, lógicos y de asignación.
¿Por qué existe esta regla?¶
El problema¶
El ojo no lee caracteres aislados: reconoce bloques. Un operador pegado a sus
operandos (a+b*c) forma una mancha uniforme donde la precedencia
(0x1013h: Detector de expresiones booleanas complejas sin paréntesis aclaratorios) se vuelve difícil de verificar. El espacio separa
visualmente los términos de la operación y deja que la estructura de la
expresión emerja sin esfuerzo.
En las palabras clave de control el espacio cumple otra función: distingue la
palabra clave de una supuesta llamada a función. if(x) se lee como si if
fuera una función; if (x) lo identifica como estructura de control.
Consecuencias de violarla¶
| Tipo de consecuencia | Efecto concreto |
|---|---|
| Compilación | Ninguna: la semántica no cambia. |
| Legibilidad | Las expresiones largas se vuelven ilegibles y esconden la precedencia. |
| Bug silencioso | Un error de precedencia (a+b*c) pasa desapercibido en la revisión. |
| Consistencia | El archivo mezcla zonas espaciadas y zonas comprimidas. |
| Revisión docente | La corrección visual y la comparación con la norma se dificultan. |
Fundamento en el estándar y en la cátedra¶
El estándar trata los espacios como separadores sin valor semántico (§6.4, tokens). La cátedra adopta el espaciado uniforme porque prepara al estudiante para reconocer las unidades léxicas de C y porque es requisito de otras reglas de espaciado del catálogo.
Alcance y excepciones¶
Cubre operadores binarios (+, -, *, /, %, =, ==, <, &&,
||, |, &, entre otros). No rige a los operadores unarios, regulados por
0x000Ch: Prohibición de espacios en blanco entre operadores unarios (++, --, !) y su operando y 0x0016h: Validador de espaciado en operadores unarios, ni a ->, . (0x000Bh: Prohibición de espacios en blanco alrededor de operadores de acceso a miembros (-> y .)) ni a la coma
(0x000Dh: Espacio en blanco obligatorio tras la coma separadora en listas y argumentos).
Ejemplos exhaustivos¶
❌ Contraejemplo 1 — Toda la expresión comprimida¶
uno=dos+tres;Por qué falla: no se distingue la asignación de la suma y el lector debe aplicar la precedencia mentalmente para saber qué se asigna.
❌ Contraejemplo 2 — Condición sin espacios y palabra clave pegada¶
if(activo&&saldo>=limite){Por qué falla: if( se confunde con una función, y activo&&saldo>=limite
oculta que hay dos operadores lógicos y uno relacional en juego.
✅ Ejemplo conforme 1 — Operadores separados¶
uno = dos + tres;
total = base * (1 + IVA);Justificación: cada operador binario tiene un espacio a cada lado; los paréntesis explicitan la agrupación de la suma.
✅ Ejemplo conforme 2 — Control con espacio y condición clara¶
if (activo && saldo >= limite)
{
autorizar();
}Justificación: el espacio tras if identifica la estructura y los
operadores relacional y lógico quedan visualmente separados.
⚠️ Casos límite¶
Unarios:
-x,!flag,*ptr,&varvan pegados a su operando; no son binarios y no llevan espacio.Cast: en
(int) xel espacio va después del paréntesis de cierre del cast, no dentro.Alineación: no se permite alinear con espacios extra; eso viola 0x000Fh: Prohibición de múltiples espacios en blanco consecutivos dentro de una línea de código.
Cómo detectarla¶
| Herramienta | Comando | Señal |
|---|---|---|
gaff | gaff check archivo.c / gaff fix archivo.c | Regla 0x0003h: operador binario sin espacio. |
clang-format | clang-format --dry-run archivo.c | Diferencias de espaciado respecto de la configuración. |
gcc / clang | gcc -Wall -Wextra -std=c11 | No detecta espaciado; sí advierte -Wparentheses por precedencia. |
Checklist de autocontrol¶
¿Cada operador binario tiene un espacio a cada lado?
¿Escribí
if (,for (,while (,switch (con espacio?¿Dejé los unarios y
->sin espacios?¿Evité usar espacios para alinear columnas?
Reglas relacionadas¶
0x0011h: Validador de espaciado estricto en sentencias de control — espaciado estricto entre palabra clave y paréntesis.
0x000Dh: Espacio en blanco obligatorio tras la coma separadora en listas y argumentos — espacio obligatorio después de la coma.
0x000Eh: Prohibición de espacios en blanco internos inmediatamente tras ‘(’ o antes de ‘)’ — sin espacios internos tras
(ni 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.
0x1013h: Detector de expresiones booleanas complejas sin paréntesis aclaratorios — paréntesis aclaratorios en expresiones lógicas mixtas.