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;
}
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.