Este sitio web usa cookies de terceros para analizar el tráfico y personalizar los anuncios. Si no está de acuerdo, abandone el sitio y no siga navegando por él. ×


2.5. Conectores lógicos: &&, ||, !

Las condiciones se pueden encadenar con "y" (para ver si las dos condiciones se cumplen a la vez), "o" (para comprobar si al menos una de ellas se cumple), "no" (para asegurarse de que una condición no se cumple), que se indican de la siguiente forma

Conector

Significado

&&

Y

||

O

!

No

Y un ejemplo:

/*  ej020501.c                 */
/*  Operadores lógicos         */
/*  Ejemplo del apartado 2.5   */
/*  Curso de C, Nacho Cabanes  */

#include 

int main() 
{
    int numero;

    printf("Escribe un número: ");
    scanf("%d", &numero);
    
    if ((numero % 2 == 0) && (numero % 3 == 0))
        printf("Es múltiplo de 2 y de 3 a la vez. ");
    else    
        if ((numero % 2 == 0) || (numero % 3 == 0))
            printf("Es múltiplo de 2 o de 3. ");
            
    if ( ! (numero % 5 == 0))
        printf("No es múltiplo de 5.");

    return 0;
}

Su funcionamiento, con varios números distintos, sería algo como:

Escribe un número: 6
Es múltiplo de 2 y de 3 a la vez. No es múltiplo de 5.
Escribe un número: 30
Es múltiplo de 2 y de 3 a la vez. 
Escribe un número: 15
Es múltiplo de 2 o de 3. 
Escribe un número: 4
Es múltiplo de 2 o de 3. No es múltiplo de 5.

La siguiente forma de escribir una condición es incorrecta (y es un error muy frecuente en los que empiezan a programar en C):

if ((opcion1 || opcion2 == 3))   ...

porque la forma correcta de comprobar si la variable "opcion1" o bien "opcion2" valen "3" sería ésta, detallando cada una de las dos condiciones:

if ((opcion1==3) || (opcion2==3))   ...

Vamos a ver un ejemplo que muestre el problema:

/*  ej020502.c                 */
/*  Condición incorrecta       */
/*  Ejemplo del apartado 2.5   */
/*  Curso de C, Nacho Cabanes  */

#include 

int main() 
{
    int n1, n2;

    printf("Escribe un número: ");
    scanf("%d", &n1);
    printf("Escribe otro: ");
    scanf("%d", &n2);
    
    if ((n1 % 3 == 0) || (n2 % 3 == 0))
        printf("Uno es múltiplo de 3 (método 1). ");
        
    if (n1 || n2 % 3 == 0)
        printf("Uno es múltiplo de 3 (método 2, incorrecto). ");

    return 0;
}

Verás que si introduces los números 4 y 5, el segundo "if" te responde que al menos uno de ellos es múltiplo de tres, lo que claramente es incorrecto.

Una curiosidad: en C (y en algún otro lenguaje de programación), la evaluación de dos condiciones que estén enlazadas con "Y" se hace "en cortocircuito": si la primera de las condiciones no se cumple, ni siquiera se llega a comprobar la segunda, porque se sabe de antemano que la condición formada por ambas no podrá ser cierta. Eso supone que en el primer ejemplo anterior, if ((opcion==1) && (usuario==2)), si "opcion" no vale 1, el compilador no se molesta en ver cuál es el valor de "usuario", porque, sea el que sea, no podrá hacer que sea "verdadera" toda la expresión. Lo mismo ocurriría si hay dos condiciones enlazadas con "o", y la primera de ellas es "verdadera": no será necesario comprobar la segunda, porque ya se sabe que la expresión global será "verdadera".

Ejercicio propuesto 2.5.1: Crea un programa que pida al usuario un número entero y responda si es múltiplo de 2 o de 5.
Ejercicio propuesto 2.5.2: Crea un programa que pida al usuario un número entero y responda si es múltiplo de 2 y de 5 simultáneamente.
Ejercicio propuesto 2.5.3: Crea un programa que pida al usuario un número entero y responda si es múltiplo de 2 pero no de 5.
Ejercicio propuesto 2.5.4: Crea un programa que pida al usuario un número entero y responda si no es múltiplo de 2 ni de 5.
Ejercicio propuesto 2.5.5: Crea un programa que pida al usuario dos números enteros y diga si ambos son pares.
Ejercicio propuesto 2.5.6: Crea un programa que pida al usuario dos números enteros y diga si (al menos) uno es par.
Ejercicio propuesto 2.5.7: Crea un programa que pida al usuario dos números enteros y diga si uno y sólo uno es par.
Ejercicio propuesto 2.5.8: Crea un programa que pida al usuario dos números enteros y diga "Uno de los números es positivo", "Los dos números son positivos" o bien "Ninguno de los números es positivo", según corresponda.
Ejercicio propuesto 2.5.9: Crea un programa que pida al usuario tres números y muestre cuál es el mayor de los tres.
Ejercicio propuesto 2.5.10: Crea un programa que pida al usuario dos números enteros y diga si son iguales o, en caso contrario, cuál es el mayor de ellos.