top of page

C es un ejemplo de programación estructurada. En este tipo de programación, es necesario contar con ciertas estructuras que permitan controlar el flujo del programa, es decir, tomar decisiones y repetir acciones.

La estructura condicional if ... else

En la gran mayoría de los programas será necesario tomar decisiones sobre qué acciones realizar. Esas decisiones pueden depender de los datos que introduzca el usuario, de si se ha producido algún error o de cualquier otra cosa.

La estructura condicional if ... else es la que nos permite tomar ese tipo de decisiones. Traducida literalmente del inglés, se la podría llamar la estructura "si...si no", es decir, "si se cumple la condición, haz esto, y si no, haz esto otro".

Un ejemplo sencillo sería el siguiente (no se trata de un programa completo, sino tan sólo una porción de código):

 

 

        if (edad < 18)                 printf("No puedes acceder.\n");        else                printf("Bienvenido.\n");

Este código de ejemplo dice que si el valor de la variable edad es menor que 18 se imprimirá "No puedes acceder.\n", mientras que en caso contrario se imprimirá "Bienvenido.\n".

Como se ve en el ejemplo, la estructura de un condicional es bastante simple:

 

 

        if (condición) {                sentencias_si_verdadero;        } else {                sentencias_si_falso;        }

La condición, encerrada entre paréntesis, es una expresión que puede dar como resultado 0 (interpretado como falso) o cualquier valor distinto de 0 (interpretado como verdadero). Cuando la condición sea verdadera, se ejecutarán las sentencias dentro del primer bloque de código, cuando la condición sea falsa, se ejecutarán las sentencias del segundo bloque de código. Las expresiones y valores de tipo verdadero/falso son también llamados valores lógicos o booleanos.

La indentación o sangría (los espacios al comienzo de las líneas) no es necesaria, pero ayuda a la claridad del código. La utilización de las llaves {...} es obligatoria cuando se quiere utilizar más de una instrucción por bloque, y optativa cuando sólo se quiere escribir una instrucción. Por claridad, sin embargo, es recomendable utilizarlas aún cuando sólo vaya a haber una instrucción.

El bloque del else es opcional. Si no se lo encuentra, sólo se realizará la acción correspondiente al bloque if.

A continuación, un ejemplo con una función, que devuelve el mayor de dos números:

 

 

int mayor(int a, int b){        if (b > a) {                return b;        }// No posee especificación de la parte "else", ya que no es necesaria.          return a; // Finaliza la función retornando el valor de "a".}

Operadores de comparación

El símbolo > visto en el último ejemplo es un operador, que en este caso compara dos números enteros y devuelve verdadero si el primero es mayor, falso en caso contrario.

A continuación un listado de los posibles operadores de comparación en C y su significado.

 

Operadores de Comparación

Operador

Significado

<

estrictamente menor que

>

estrictamente mayor que

<=

menor o igual que

>=

mayor o igual que

==

igual a

!=

distinto de


Teniendo en cuenta que en C se toma como falso el valor 0, y como verdadero cualquier otro valor, una práctica común es expresar condiciones sin utilizar ningún operador:

 

 

float division(int dividendo, int divisor){        if (divisor) {                return dividendo / divisor;        } else {                printf ("No se puede dividir por cero\n");                return 0;        }}

En este caso, la expresión (divisor) es equivalente a (divisor != 0).

Operadores lógicos

Los operadores && ("y"), || ("o") y ! ("no") son operadores lógicos. Permiten operar con expresiones lógicas para generar expresiones más complejas.

Por ejemplo: determinar si un año es bisiesto o no. Los años son bisiestos si son divisibles por 4, pero no si son divisibles por 100, a menos que también sean divisibles por 400.

 

 

        if ( (!(a % 4) && ((a % 100))) || !(a % 400) )  {                printf("es un año bisiesto.\n");        } else {                printf("no es un año bisiesto.\n");        }

En realidad, teniendo en cuenta la prioridad de los operadores utilizados, podemos simplificar la expresión anterior del siguiente modo:

 

 

        if ( !(a % 4) && (a % 100) || !(a % 400) )  {                printf("es un año bisiesto.\n");        } else {                printf("no es un año bisiesto.\n");        }

Además, como a cada rama del if le sigue una única instrucción, podemos expresar la expresión anterior del siguiente modo:

 

 

        if ( !(a % 4) && (a % 100) || !(a % 400) )                  printf("es un año bisiesto.\n");        else                 printf("no es un año bisiesto.\n");


En este caso, se utiliza el operador módulo (%), que obtiene el resto de la división entera de un número por otro. Cuando un número es divisible por otro, el resto de su división entera será cero. Siendo que cero es equivalente a falso, y cualquier valor distinto de cero es equivalente a verdadero, podemos usar el operador % para verificar si el número es múltiplo de 4, de 100 o de 400.

 

Sintaxis: if(expresión) sentencia;
 ó if(expresion) bloque_de_sentencia;
La sentencia sólo se ejecutará si el resultado de expresión es distinto de cero (verdadero) , en
caso contrario el programa salteará dicha sentencia , realizando la siguiente en su flujo.
Veamos unos ejemplos de las distintas formas que puede adoptar la expresión dentro de un if
:
if(a>b)
if(a)
if(!a)
if(a==b)
if(a)
if((a>b)!=0)
if(a!=0)
if(a==0)
if(a=b)
if a
1. Las dos expresiones son idénticas.
2. Las dos expresiones son idénticas.
3. Obsérvese que (!a) dará un valor
verdadero sólo cuando a sea falso.
4. En la primera se hace una comparación
entre a y b; en la segunda se b a a.
Ambas son correctas pero distintas.
5. Muy simplificada, poca legibilidad.

 

Proposición else.
El uso del else es optativo , y su aplicación resulta en la ejecución de una , ó una serie de
sentencias en el caso de que el resultado de la expresión del if sea falso.
Su aplicación puede verse en el ejemplo siguiente :
If(expresión)
{
Sentencia 1 ;
Sentencia 2 ;
}
sentencia 3 ;
sentencia 4 ;
sentencia 5 ;
if(expresión)
{
sentencia 1 ;
sentencia 2 ;
}
else
{
sentencia 3 ;
sentencia 4 ;
}
sentencia 5 ;
1. En primer ejemplo, no se usa el else y
por lo tanto las sentencias 3 , 4 y 5
se ejecutarán siempre.
2. En el segundo, las sentencias 1 y 2 se
ejecutan solo si la expresión es cierta y no
se ejecutarán la 3 y la 4 para saltar
directamente a la 5.
En caso de que la expresión resulte falsa
se realizarán la 3 y la 4
en lugar de la 1 y la 2 y luego la 5.
En caso de decisiones múltiples, es común el uso de anidamientos else-if de la forma
indicada abajo:
if(exp1)
 sentencia 1;
else if(exp2)
 sentencia 2;
else if(exp3)
 sentencia 3;
else
 sentencia 5;
if(exp1)
 sentencia 1;
else if(exp2)
 sentencia 2;
 else if(exp3)
 sentencia 3;
 else
 sentencia 5;
Se suele escribir según la
modalidad de la izquierda.
A la derecha se han expresado
las asociaciones entre los
distintos else-if para mayor
legibilidad.
El operador condicional (? :)
Sintaxis: (condicion) ? (expresion 1) : (expresion 2);
En las sentencias de selección en las que hay solo un else se pueden reescribir mediante el
operador condicional (? :) , donde las expresiones 1 y 2 deben ser simples y no pueden formar
bloques de instrucciones. Primero se evalúa la condicion, si es verdadera, se ejecuta la
expresion1, y si es falsa, se ejecuta expresion2.
if(x<1)
 puts("No toques nada...");
else
 puts("Continúe,joven...");
El código se puede reescribir como:
(x<1)? puts("No toques nada..."):
 puts("Continúe,joven...");

 

3.5 INSTRUCCIONES PARA CONTROL DE PROGRAMAS

bottom of page