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 0x0002h: Una declaración de variable por línea

Sintaxis y formato visual (0x00XX)

Universidad Nacional de Río Negro

0x0002h: Una declaración de variable por línea

Enunciado normativo

DEBE declararse cada variable en su propia línea y escribirse cada sentencia en una línea separada. NO DEBE apilar varias declaraciones ni varias sentencias en una misma línea.

La regla alcanza tanto a las declaraciones como a las sentencias ejecutables.

¿Por qué existe esta regla?

El problema

Una línea con int a, b, c; parece una sola acción, pero son tres objetos independientes con vidas y tipos potencialmente distintos. En las declaraciones compuestas de punteros el problema es peor: en int *a, b; solo a es puntero y b es un entero, una trampa clásica que la regla elimina de raíz.

Además, el depurador trabaja a nivel de línea de código fuente: si dos sentencias comparten línea, el punto de interrupción las abarca a ambas y no se puede detener el programa entre una y otra.

Consecuencias de violarla

Tipo de consecuenciaEfecto concreto
CompilaciónNinguna por sí sola; puede ocultar el error de tipo en int *a, b;.
DepuraciónEl breakpoint de GDB no distingue las sentencias de la misma línea.
Bug silenciosoVariables agrupadas se inicializan u olvidan en bloque.
MantenibilidadAgregar un comentario por variable es imposible sin reescribir la línea.
LegibilidadEl diff de control de versiones mezcla cambios de variables distintas.

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

El estándar permite listas de declaradores (§6.7) y secuencias de sentencias separadas por ; (§6.8.3), así que la restricción es puramente de estilo. La cátedra la adopta porque la depuración con GDB y la trazabilidad línea a línea son objetivos de aprendizaje tempranos.

Alcance y excepciones

Aplica a declaraciones locales, globales y sentencias. No alcanza a la cabecera de un for, donde la inicialización y el incremento comparten obligatoriamente la misma línea, ni a la lista de parámetros de una función, que no son declaraciones independientes.

Ejemplos exhaustivos

❌ Contraejemplo 1 — Declaración múltiple

int a, b, c;
a = 1; b = 2; c = 3;

Por qué falla: tres variables y tres asignaciones quedan invisibles para el depurador; además impide inicializar cada una según su rol.

❌ Contraejemplo 2 — Puntero escondido en una lista

int *ptr, contador;

Por qué falla: solo ptr es puntero. Quien lee rápido asume que contador también lo es y comete un error de tipos difícil de rastrear.

✅ Ejemplo conforme 1 — Una variable por línea

int cantidad = 0;
int total = 0;
int *ptr = NULL;

Justificación: cada declaración expone su tipo, su nombre y su valor inicial en una línea que se puede comentar, mover o poner bajo breakpoint.

✅ Ejemplo conforme 2 — Una sentencia por línea

int mayor = edades[0];
int menor = edades[0];

for (size_t i = 0; i < cantidad; i++)
{
    if (edades[i] > mayor)
    {
        mayor = edades[i];
    }

    if (edades[i] < menor)
    {
        menor = edades[i];
    }
}

Justificación: el cuerpo separa las dos comparaciones; cada actualización es un paso observable y el for conserva su cabecera compacta por convención.

⚠️ Casos límite

Cómo detectarla

HerramientaComandoSeñal
gaffgaff check archivo.cLíneas con más de un ; o listas de declaradores.
gcc / clanggcc -Wall -Wextra -std=c11 -pedantic-Wunused-variable reporta la variable de la lista que quedó sin usar.
GDBgdb ./prog + break lineaLa parada cae en varias sentencias a la vez.

Checklist de autocontrol

Reglas relacionadas