Regla 0x100Ch: Espaciado obligatorio alrededor de operadores ternarios ('? :')
Estructuras de control y flujo (0x10XX)
0x100Ch: Espaciado obligatorio alrededor de operadores ternarios (‘? :’)¶
Enunciado normativo¶
Cuando se use el operador condicional
?:—lo que la cátedra desaconseja por 0x1007h: No utilizar el operador condicional (ternario) ?:—, DEBE colocarse exactamente un espacio en blanco antes y después de?y de:. NO DEBE aparecer el operador pegado a sus operandos ((a < b)?a:b).
¿Por qué existe esta regla?¶
El problema¶
Los tres tokens ?, : y ) compiten por la atención cuando están pegados.
Sin espacios, (a < b)?a:b se lee como una masa de signos donde cuesta separar
la condición de las dos ramas. El espaciado es la única señal visual que agrupa
cada parte.
Aun así, el espaciado no resuelve el problema de fondo del ternario: su condición y sus ramas siguen embutidas en una expresión. Por eso la cátedra lo desaconseja en 0x1007h: No utilizar el operador condicional (ternario) ?:; esta regla solo normaliza el código legado o excepcional mientras se elimina.
Consecuencias de violarla¶
| Tipo de consecuencia | Efecto concreto |
|---|---|
| Legibilidad | Los operandos y los operadores se confunden visualmente. |
| Estilo | Rompe la convención general de espaciado de operadores. |
| Revisión | El corrector gasta atención en descifrar en lugar de evaluar la lógica. |
| Riesgo de bug | Un ? pegado puede confundirse con parte de un identificador. |
Fundamento en el estándar y en la cátedra¶
ISO/IEC 9899:2011 §6.5.15 define ? :; el espaciado es cuestión de estilo. La
cátedra adopta la misma convención que para los operadores binarios en
0x0003h: Un espacio antes y después de cada operador binario: un espacio a cada lado. gaff lo aplica automáticamente, pero
el objetivo es que el autor lo escriba bien desde el inicio.
Alcance y excepciones¶
Aplica a todo
?:que sobreviva en el código.No habilita el uso del ternario: sigue prohibido por 0x1007h: No utilizar el operador condicional (ternario) ?:.
El
?de un literal de tipochar('?') o de una directiva no es un operador y no está alcanzado.
Ejemplos exhaustivos¶
❌ Contraejemplo 1 — ternario sin espacios¶
int min = (a < b)?a:b;Por qué falla: los dos puntos quedan pegados a ambas ramas y el ojo lee b:a
como una unidad. La condición también se confunde con su paréntesis.
❌ Contraejemplo 2 — espaciado inconsistente¶
int max = (a > b) ?a : b;Por qué falla: hay espacio antes de ? pero no después, y no hay espacio antes
de :. La asimetría sugiere una estructura que no existe y distrae.
✅ Ejemplo conforme 1 — espaciado simétrico¶
int min = (a < b) ? a : b;Un espacio a cada lado de ? y :; cada token se separa y la expresión se lee
por partes.
✅ Ejemplo conforme 2 — reemplazo por if / else¶
int min;
if (a < b)
{
min = a;
}
else
{
min = b;
}La forma conforme por excelencia: se elimina el ternario, con lo cual el espaciado deja de ser un problema (ver 0x1007h: No utilizar el operador condicional (ternario) ?:).
⚠️ Casos límite¶
Ternario anidado: el espaciado no alcanza para volverlo legible; debe reescribirse con
if/else if.?:sin ramaelse(GNU): no es C estándar; no usar.Plantillas o cadenas: el carácter
?dentro de un literal no se espacia.
Cómo detectarla¶
| Herramienta | Comando | Señal |
|---|---|---|
gaff | gaff check archivo.c | Regla 0x100Ch: espaciado del ternario (autofix). |
gcc | gcc -Wall -Wextra | No la detecta; es cuestión de formato. |
| Revisión manual | — | ? o : pegados a un operando. |
Checklist de autocontrol¶
¿Queda algún
?:? Evaluar reemplazarlo porif/else.¿Todos los
?y:tienen un espacio a cada lado?¿La expresión sigue siendo legible pese al ternario?
¿Los
?dentro de literales no se tocaron?
Reglas relacionadas¶
0x1007h: No utilizar el operador condicional (ternario) ?: — prohíbe el uso del operador condicional.
0x0003h: Un espacio antes y después de cada operador binario — espaciado general alrededor de operadores binarios.
0x1004h: Las condiciones complejas deben simplificarse o comentarse — descomponer condiciones complejas con variables auxiliares.