Control de flujo condicional if - else

La forma ampliada permite ejecutar dos bloques de sentencias distintas dependiendo de que se cumpla la condición o no.

if (condicion)
{
   bloque de sentencias 1;
}
else
{
   bloque de sentencias 2;
}
../../_images/if_else.jpg

Diagrama de flujo de la sentencia if - else

Ejemplo 1

/*----------------------------------------------------*/
/* Grados celsius -> grados kelvin                    */
/* Comprueba si la temperatura tiene existencia real  */
/* En caso negativo visualiza un mensaje de error     */
/*----------------------------------------------------*/

#include <iostream>
using namespace std;

int main()
{
   double centig;
   cout << "Introduzca grados celsius: ";
   cin >> centig;

   if (centig >= -273.)
   {
      double kelvin = centig + 273.;
      cout << centig << " grados celsius son " << kelvin
            << " grados kelvin\n";
   }
   else
   {
      cout << "Esa temperatura no existe.\n";
   }
}

Edita, compila y ejecuta el código

Ejemplo 2

// Ejemplo que ilustra el hecho de que hay que evitar
// realizar comparaciones entre valores en coma flotante

#include <iostream>
using namespace std;

int main()
{
   double x = 0.3;
   double y = 0.1;
   double z = 0.2;

   if (x == y+z) // Matemáticamente son iguales, pero ...
      cout << "x es igual a y+z.\n";
   else
      cout << "x no es igual a y+z.\n";
}

Edita, compila y ejecuta el código

Ejemplo 3

// Ejemplo similar al anterior: no existe asociatividad en
// operaciones en coma flotante
#include <iostream>
using namespace std;

int main()
{
   double x = 0.1 + (0.2 + 0.3);
   double y = (0.1 + 0.2) + 0.3;
   // Fija 20 posiciones a visualizar despues de la coma
   cout.precision(20);
   cout << "x=" << x << "\ny=" << y << endl;

   if (x == y) // Matemáticamente son iguales, pero ...
      cout << "x es igual a y\n";
   else
      cout << "x no es igual a y\n";
}

Edita, compila y ejecuta el código

Consideraciones respecto a la sintaxis

El siguiente fragmento ilustra un error de sintaxis habitual.

if (a != 0)
{
   b = a;
   a = 1/a;
};
else
   cout << "No se puede invertir el 0\n";

El ; tras la llave de cierre } es la causa del error. Podemos reescribir el código como:

if (a != 0)
{
   b = a;
   a = 1/a;
}
;
else
   cout << "No se puede invertir el 0\n";

Así se aprecia mejor que la sentencia vacía ; hace que el else quede desvinculado del if.

Otro error sintáctico típico es olvidar las llaves {...}.

if (a != 0)
   b = a;
   a = 1/a;
else
   cout << "No se puede invertir el 0\n";

Podemos reescribir el código como:

if (a != 0)
   b = a;
a = 1/a;
else
   cout << "No se puede invertir el 0\n";

Así se aprecia mejor que la sentencia a = 1/a; no pertenece al bloque if y, de nuevo, el else queda desvinculado.

Advertencia

Un error semántico muy habitual es situar un ; tras el cierre de paréntesis ) de la condición if.

if (a != 0);
{
   b = a;
   a = 1/a;
}

Para apreciar el error semántico, podemos reescribir el código como:

if (a != 0)
   ;

{
   b = a;
   a = 1/a;
}

Ahora resulta que la única sentencia asociada al if es la sentencia vacía ;. El bloque de sentencias entre llaves {...} se ejecutará siempre.

Los errores semánticos son en muchas ocasiones los más complejos de depurar, pues pasan desapercibidos para el compilador y sólo son detectables a través de la salida espuria del programa.