Verdadero y falso en C: la regla del cero
En C, una condición no necesita ser “booleana” en el sentido estricto: cualquier expresión entera se interpreta así:
- 0 se considera falso
- cualquier valor distinto de 0 se considera verdadero
Esto aplica a resultados de comparaciones (que producen 0 o 1) y también a expresiones numéricas comunes.
int x = 5; if (x) { /* se ejecuta: x es distinto de 0 */ } if (x - 5) { /* NO se ejecuta: x-5 es 0 */ }if / else: decisiones básicas
La estructura if ejecuta un bloque si la condición es verdadera. Con else defines el camino alternativo.
if (condicion) { /* camino A */ } else { /* camino B */ }Guía práctica: escribir un if/else sin errores
- 1) Escribe la condición como una comparación clara (por ejemplo,
edad >= 18). - 2) Usa llaves
{}incluso si hay una sola instrucción (reduce errores al editar). - 3) Revisa que no estés usando
=donde debería ir==.
Asignación (=) vs comparación (==): el error clásico
= asigna un valor. == compara dos valores. Confundirlos cambia el flujo del programa.
int a = 3; if (a = 0) { /* a se vuelve 0, condición falsa, NO entra */ } if (a == 0) { /* compara, entra si a es 0 */ }El primer if es un bug típico: la asignación a = 0 produce el valor 0, y como 0 es falso, el bloque no se ejecuta. Además, a queda modificado.
- Escuche el audio con la pantalla apagada.
- Obtenga un certificado al finalizar.
- ¡Más de 5000 cursos para que explores!
Descargar la aplicación
Patrón recomendado: activa advertencias del compilador y escribe condiciones que “se lean” como comparaciones. En C moderno, también puedes forzar claridad con paréntesis:
if ((a == 0)) { /* intencional */ }else if: múltiples caminos
Cuando hay más de dos opciones, encadena condiciones con else if. Se evalúan en orden: el primer bloque cuya condición sea verdadera se ejecuta y el resto se omite.
int nota = 76; if (nota >= 90) { /* A */ } else if (nota >= 80) { /* B */ } else if (nota >= 70) { /* C */ } else { /* D */ }Lectura de código: identifica el camino de ejecución
Para nota = 76:
nota >= 90→ falsonota >= 80→ falsonota >= 70→ verdadero → se ejecuta el bloqueC- El
elseya no se evalúa
Comparaciones correctas con rangos
En C no puedes escribir rangos como en matemáticas: 0 <= x <= 10 no significa lo que parece.
El error: encadenar comparaciones
int x = 20; if (0 <= x <= 10) { /* ¿entra? */ }Esto se evalúa en dos pasos: primero 0 <= x produce 0 o 1; luego ese resultado se compara con 10. Si x es 20, 0 <= x da 1, y 1 <= 10 es verdadero. Resultado: entra cuando no debería.
La forma correcta: usar operadores lógicos
if (x >= 0 && x <= 10) { /* x está en [0,10] */ }Para rangos excluyentes:
if (x > 0 && x < 10) { /* x está en (0,10) */ }Operadores lógicos y cortocircuito (short-circuit)
Los operadores lógicos más usados en condiciones son:
&&(AND): verdadero si ambas expresiones son verdaderas||(OR): verdadero si al menos una es verdadera!(NOT): invierte verdadero/falso
En C, && y || tienen cortocircuito: si el resultado ya se puede determinar, la segunda parte no se evalúa.
Ejemplo: evitar accesos inválidos
int i = -1; int arr[3] = {10, 20, 30}; if (i >= 0 && i < 3 && arr[i] == 20) { /* seguro */ }Si i es -1, la primera condición i >= 0 es falsa, así que el resto no se evalúa y no hay acceso fuera de rango.
Lectura de código: orden de evaluación
Para i = 2:
i >= 0→ verdadero, continúai < 3→ verdadero, continúaarr[i] == 20→arr[2]es 30 → falso- Resultado final: falso
Ojo: & y | no son lo mismo que && y ||
& y | son operadores bit a bit y no hacen cortocircuito. En condiciones, usa && y || salvo que realmente necesites operaciones a nivel de bits.
Operador ternario ?: (decisión en una expresión)
El operador ternario permite elegir entre dos valores según una condición. Es útil para asignaciones o para construir expresiones, pero conviene mantenerlo simple para no perder legibilidad.
resultado = (condicion) ? valor_si_verdadero : valor_si_falso;Ejemplos prácticos
int edad = 17; const char *tipo = (edad >= 18) ?