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 0x100Bh: No utilices comparaciones en estilo Yoda ('CONST == variable')

Estructuras de control y flujo (0x10XX)

Universidad Nacional de Río Negro

0x100Bh: No utilices comparaciones en estilo Yoda (‘CONST == variable’)

Enunciado normativo

DEBE escribirse la comparación con la variable o expresión a la izquierda y la constante a la derecha: variable == CONSTANTE. NO DEBE invertirse el orden para obtener CONSTANTE == variable.

¿Por qué existe esta regla?

El problema

El estilo Yoda nació como defensa artesanal: si se escribe 0 == x y el autor teclea = en lugar de ==, el compilador rechaza la asignación a un literal. El truco funcionaba en compiladores antiguos sin advertencias, pero hoy es innecesario y tiene un costo.

Invertir el orden obliga al lector a traducir mentalmente: primero lee el valor y después descubre qué se está comparando. El flujo natural del lenguaje es “sujeto, verbo, objeto”: la variable primero. Además, colocar la constante a la izquierda es un arma de doble filo limitada: solo protege contra el error cuando el lado izquierdo es literal, no contra todos los casos.

Consecuencias de violarla

Tipo de consecuenciaEfecto concreto
LegibilidadLa lectura del flujo lógico se vuelve antinatural y más lenta.
InconsistenciaConviven NULL == ptr y x == 0 en el mismo archivo.
Falsa seguridadEl truco no cubre comparaciones entre dos variables.
HerramientasLos parsers y refactors asumen el orden natural.

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

ISO/IEC 9899:2011 §6.5.9 define el operador == de forma simétrica; el orden es libre. La cátedra impone el orden natural y se apoya en las advertencias de gcc -Wall -Wparentheses (ver 0x1009h: Prohibición de asignaciones simples dentro de condiciones lógicas) para detectar el = accidental. La protección moderna reemplaza al truco.

Alcance y excepciones

Ejemplos exhaustivos

❌ Contraejemplo 1 — NULL y 0 a la izquierda

if (NULL == ptr || 0 == count)
{
    liberar();
}

Por qué falla: exige leer primero los valores neutros y después las variables. El orden natural del razonamiento es preguntar por ptr y por count, no por NULL y 0.

❌ Contraejemplo 2 — literal de carácter a la izquierda

if ('\n' == caracter)
{
    continuar();
}

Por qué falla: mezcla dos convenciones si en otros puntos del archivo se compara caracter == '\n'. La inconsistencia obliga a releer cada condición.

✅ Ejemplo conforme 1 — orden natural

if (ptr == NULL || count == 0)
{
    liberar();
}

La variable va primero y la constante después; el lector sigue el mismo orden en todo el archivo.

✅ Ejemplo conforme 2 — constante enum y macro

if (estado == ESTADO_ACTIVO)
{
    reactivar();
}

if (intentos == MAX_INTENTOS)
{
    bloquear();
}

La comparación se lee de izquierda a derecha sin invertir el sujeto, y el = accidental lo detecta el compilador con -Wparentheses.

⚠️ Casos límite

Cómo detectarla

HerramientaComandoSeñal
gaffgaff check archivo.cRegla 0x100Bh: comparación en estilo Yoda (autofix).
gccgcc -Wall -Wextra -Wparentheseswarning si el = se coló en una comparación.
Búsquedagrep -n "== NULL" archivo.cLiteral a la izquierda.

Checklist de autocontrol

Reglas relacionadas