Como suele ocurrir en C, hemos dado por supuestas cosas que realmente son más complejas de lo que parece a primera vista: la comprobación de una condición en un "if" no necesariamente tiene que tener un "valor de verdad" (verdadero o falso), sino que también puede ser un número. De hecho, las condiciones se evalúan y se obtiene un valor numérico a partir de ellas: una condición cuyo resultado sea "falso" devolverá un 0, y otra cuyo resultado sea "verdadero" devolverá el valor 1, como se puede ver en este ejemplo:
/* ej020601.c */
/* Valor numérico de condiciones */
/* Ejemplo del apartado 2.6 */
/* Curso de C, Nacho Cabanes */
#include
int main()
{
printf("2==3 vale %d. ", 2==3); /* Escribe 0 */
printf("2!=3 vale %d. ", 2!=3); /* Escribe 1 */
return 0;
}
En general, si la "condición" de un if es algo que valga 0, se considerará que la condición es falsa (no se cumple), y si es algo distinto de cero, se considerará que la condición es verdadera (sí se cumple). Eso nos permite hacer cosas como ésta:
/* ej020602.c */
/* Comparación abreviada */
/* Ejemplo del apartado 2.6 */
/* Curso de C, Nacho Cabanes */
#include
int main()
{
int numero;
if (1) /* Condición siempre verdadera */
printf("Esto se escribirá siempre. ");
if (0) /* Condición siempre falsa */
printf("Esto no se escribirá nunca. ");
printf("Escribe un número: ");
scanf("%d", &numero);
if (numero != 0) /* Comparación normal */
printf("El número no es cero. ");
if (numero) /* Comparación "con truco" */
printf("Y sigue sin ser cero.");
return 0;
}
En este ejemplo, la expresión "if (numero)" hará que el compilador analice el valor de la variable "numero". Si es distinto de cero, se considerará que la condición es correcta, y se ejecutará la sentencia correspondiente (el "printf"). En cambio, si la variable "numero" vale 0, se considera que la condición es falsa, y no se ejecutan las sentencias correspondientes.
En general, es preferible evitar este tipo de construcciones. Aunque para el compilador sean equivalentes, para un humano que revise el programa resultará mucho más legible algo como "if (numero!=0)" que "if(numero)".
Ejercicio propuesto 2.6.1: Al igual que en el ejercicio 2.4.2, crea un programa que pida al usuario dos números enteros. Si el segundo no es cero, mostrará el resultado de dividir el primero entre el segundo. Por el contrario, si el segundo número es cero, escribirá "Error: No se puede dividir entre cero". La condición debe usar el formato "if(numero)".