En este capítulo se revisan los distintos métodos con los que C controla el flujo lógico de un programa.
Como se revisó en el capítulo anterior, los operadores relaciones binarios que se usan son:
==
, !=
, <
, <=
, >
y >=
además los operadores lógicos binarios:
||
, &&
y el operador lógico unario de negación !
, que sólo toma un
argumento.
Los operadores anterior son usados con las siguientes estructuras que se muestran.
Las tres formas como se puede emplear la sentencia if
son:
if (condicion)sentencia;
...o
if (condicion)sentencia1;elsesentencia2;
...o
if (condicion1)sentencia1;else if (condicion2)sentencia2;...
elsesentencian;
El flujo lógico de esta estructura es de arriba hacia abajo. La
primera sentencia se ejecutará y se saldrá de la estructura if
si la
primera condición es verdadera. Si la primera condición fue falsa, y
existe otra condición, se evalúa, y si la condición es verdadera,
entonces se ejecuta la sentencia asociada. Si existen más condiciones
dentro de la estructura if
, se van evaluando éstas, siempre y cuando las condiciones que le precedan sean falsas.
La sentencia que esta asociada a la palabra reservada else
, se ejecuta
si todas las condiciones de la estructura if
fueron falsas.
Por ejemplo:
main() { int x, y, w; ........ if (x>0) { z=w; ....... } else { z=y; ....... } }
El operador ternario condicional ?
es más eficiente que la sentencia
if
. El operador ?
tiene el siguiente formato:
expresion1 ? expresion 2 : expresion3;
Que es equivalente a la siguiente expresión:
if (expresion1) then expresion2 else expresion3;
Por ejemplo, para asignar el máximo de a
y b
a la variable z, usando ?
, tendríamos:
z = (a>b) ? a : b;
que es lo mismo que:
if (a > b) z = a; else z = b;
El uso del operador ?
para reemplazar las sentencias if ... else
no se restringe sólo a asignaciones, como en el ejemplo anterior. Se
pueden ejecutar una o más llamadas de función usando el operador ?
poniéndolas en las expresiones que forman los operandos, como en el ejemplo siguiente:
f1(int n) { printf("%d ",n); } f2() { printf("introducido\n"); } main() { int t; printf(": "); scanf("%d",&t); /* imprime mensaje apropiado */ t ? f1(t) + f2() : printf("Se dió un cero\n"); }
Aunque con la estructura if ... else if
se pueden realizar
comprobaciones múltiples, en ocasiones no es muy elegante, ya que el
código puede ser difícil de seguir y puede confundir incluso al autor
transcurrido un tiempo. Por lo anterior, C tiene incorporada una sentencia de
bifurcación múltiple llamada switch
. Con esta sentencia, la
computadora comprueba una variable sucesivamente frente a una lista de
constantes enteras o de caracter. Después de encontrar una coincidencia, la
computadora ejecuta la sentencia o bloque de sentencias que se asocian con la
constante. La forma general de la sentencia switch
es:
switch (variable) {case constante1:secuencia de sentencias
break;case constante2:secuencia de sentencias
break;case constante3:...secuencia de sentencias
break;
default:}secuencia de sentencias
donde la computadora ejecuta la sentencia default
si no coincide
ninguna constante con la variable, esta última es opcional. Cuando
se encuentra una coincidencia, la computadora ejecuta las sentencias asociadas
con el case
hasta encontrar la sentencia break
con lo que sale de la estructura switch
.
Las limitaciones que tiene la sentencia switch ... case
respecto a la estructura if
son:
switch
sólo se puede comprobar por igualdad, mientras que
con if
puede ser con cualquier operador relacional.
case
.
La forma como se puede simular el último punto, es no teniendo sentencias
asociados a un case
, es decir, teniendo una sentencia
nula donde sólo se pone el caso, con lo que se permite que el flujo del programa caiga al omitir las sentencias, como se muestra a continuación:
switch (letra) { case 'a': case 'e': case 'i': case 'o': case 'u': numvocales++; break; case ' ': numesp++; break; default: numotras++; break; }
exit( 0 );