Original article: If...Else Statement in C Explained

El flujo de código condicional es la capacidad de cambiar la forma en la que se comporta un fragmento de código en función en ciertas condiciones. En tales situaciones puedes usar las sentencias if.

La sentencia if también se conoce como una sentencia de toma de decisiones, ya que toma una decisión sobre la base de una condición o expresión dada. El bloque de código dentro de la instrucción if que se ejecuta es la condición evaluada como true. Sin embargo, el código dentro de las llaves se omite si la condición es evalúa como false, y el código después de la sentencia if es ejecutada.

Sintaxis de sentencia if

if (testCondition) {
   // statements
}

Un ejemplo sencillo

Vamos a ver un ejemplo de esto en acción:

#include <stdio.h>
#include <stdbool.h>

int main(void) {
    if(true) {
        printf("Statement is True!\n");
    }

    return 0;
}

Salida:

Statement is True!

Si el código entre el paréntesis de la sentencia if es true, todo dentro de las llaves es ejecutado. En este caso, true evalúa a true, entonces el código ejecuta la función printf.

Sentencias if..else

En una sentencia if...else, si el código en el paréntesis de la sentencia if  es true, el código dentro de las llaves es ejecutado. Pero si la sentencia dentro del paréntesis es falso, todo el código dentro de las llaves de la sentencia else es ejecutada en su lugar.

Claro, en el ejemplo anterior no fue muy útil en este caso porque true siempre evalúa a verdadero. Aquí hay otro que es un poco más práctico:

#include <stdio.h>

int main(void) {
    int n = 2;

    if(n == 3) { // comparing n with 3
        printf("Statement is True!\n");
    } 
    else { // if the first condition is not true, come to this block of code
        printf("Statement is False!\n");
    }

    return 0;
}

Salida:

Statement is False!

Hay algunas diferencias importantes aquí. En primer lugar, stdbool.h no se ha sido incluido. Eso está bien porque true  y  false no se usan como en el primer ejemplo. En C, como en otros lenguajes de programación, puede usar sentencias que evalúan como verdadero o falso en lugar de usar los valores booleanos true o false directamente.

Observe también la condición en el paréntesis de la sentencia if: n == 3. Esta condición compara n y el número 3. == es el operador comparación,  y es una de varias operaciones de comparación C.

if...else anidado

La sentencia if...else permite elegir entre dos posibilidades. Pero algunas veces necesita elegir entre tres o más posibilidades.

Por ejemplo, el signo función en matemáticas devuelve -1 si es argumento es menor que cero, +1 si el argumento es mayor que cero, y devuelve cero si el argumento es cero.

El siguiente código implementa esta función:

if (x < 0)
   sign = -1;
else
   if (x == 0)
      sign = 0;
   else
      sign = 1;

Como puede ver, una segunda sentencia if...else es anidada dentro de la sentencia de la primera sentencia if..else.

Si x  es menor que 0, entonces sign se establece en -1. Sin embargo, si x no es menor que 0, la segunda sentencia if...else es ejecutada. Allí, si x es igual a 0, sign también se establece en 0. Pero si x es mayor que 0, sign en lugar de ser establece en 1.

En lugar en una sentencia if...else anidada, los principiantes a menudo usan una cadena de sentencias if:

if (x < 0) {
   sign = -1;
}
   
if (x == 0) {
   sign = 0;
}
   
if (x > 0) {
   sign = 1;
}

Si bien esto funciona, no se recomienda, ya que no está claro que solo una de las instrucciones de asignación (sign = ...) está destinada al ejecutarse dependiendo del valor de x. También es ineficiente: cada vez que se ejecuta el código, se prueban la tras condiciones, incluso si una o dos no tienen que serlo.

Sentencia else...if

Sentencias if...else son una alternativa a una cadena de sentencias if. Considere lo siguiente:

#include <stdio.h>

int main(void) {
    int n = 5;

    if(n == 5) {
        printf("n is equal to 5!\n");
    } 
    else if (n > 5) {
        printf("n is greater than 5!\n");
    }

    return 0;
}

Salida:

n is equal to 5!

Si la condición de la sentencia if se evalúa a false, la condición para la sentencia else...if es revisada. Si la condición evalúa a true, el código dentro de las llaves de la sentencia else...if se ejecuta.

Operadores de comparación

OPERATOR NAMEUSAGERESULT
Equal Toa == bTrue if a is equal to b, false otherwise
Not Equal Toa != bTrue if a is not equal to b, false otherwise
Greater Thana > bTrue if a is greater than b, false otherwise
Greater Than or Equal Toa >= bTrue if a is greater than or equal to b, false otherwise
Less Thana < bTrue if a is less than b, false otherwise
Less Than or Equal Toa <= bTrue if a is less than or equal to b, false otherwise

Operadores Lógicos

Es posible que deseemos ejecutar un poco de código si algo no es cierto, o si dos cosas son verdaderas. Para eso tenemos operadores lógicos:

OPERATOR NAMEUSAGERESULT
Not (!)!(a == 3)True if a is not equal to 3
And (&&)a == 3 && b == 6True if a is equal to 3 and b is equal to 6
Or (||)a == 2 || b == 4True if a is equal to 2 or b is equal to 4

Por ejemplo:

#include <stdio.h>

int main(void) {
    int n = 5;
    int m = 10;

    if(n > m || n == 15) {
        printf("Either n is greater than m, or n is equal to 15\n");
    } 
    else if( n == 5 && m == 10 ) {
        printf("n is equal to 5 and m is equal to 10!\n");
    } 
    else if ( !(n == 6)) {
        printf("It is not true that n is equal to 6!\n");
    }
    else if (n > 5) {
        printf("n is greater than 5!\n");
    }

    return 0;
}

Salida:

n is equal to 5 and m is equal to 10!

Una nota importante sobre las comparaciones C

Como lo mencionamos con anterioridad que cada comparación verifica si algo es verdadero o falso, pero eso solo es una verdad a medias. C es muy ligero y cercano al hardware en el que se está ejecutando. Con el hardware es fácil comprobar si algo es 0 o falso, pero cualquier otra cosa es mucho más difícil.

En cambio, mucho más preciso decir que las comparaciones realmente están comprobando si algo es 0/ falso, o si es cualquier otro valor.

Por ejemplo, esta sentencia if es verdadera y válida:

if(12452) {
    printf("This is true!\n")
}

Por diseño, 0 es falso, y por convención, 1 es verdadero. De hecho, aquí hay un vistazo a la biblioteca stdbool.h:

#define false   0
#define true    1

Si bien hay un poco más, este es el núcleo de cómo funcionan los booleanos y cómo funciona la biblioteca. Estas dos líneas indican al compilador que reemplace la palabra false con 0 y true con 1.