Articolo originale: https://www.freecodecamp.org/news/if-statements-in-c/

Il flusso di codice condizionale è la capacità di modificare il modo in cui un pezzo di codice si comporta in base a determinate condizioni. In tali situazioni puoi usare le istruzioni if.

L'istruzione if è anche nota come dichiarazione decisionale, poiché prende una decisione sulla base di una data condizione o espressione. Il blocco di codice all'interno della dichiarazione if viene eseguito se la condizione restituisce true. Invece, il codice all'interno delle parentesi graffe viene ignorato se la condizione restituisce false e il codice dopo l'istruzione if viene eseguito.

Sintassi di un'istruzione if

if (condizioneTest) {
   // istruzioni
}

Un semplice esempio

Diamo un'occhiata a un esempio di quanto appena detto:

#include <stdio.h>
#include <stdbool.h>

int main(void) {
    if(true) {
        printf("La condizone è Vera!\n");
    }

    return 0;
}

Output:

La condizone è Vera!

Se il codice tra parentesi dell'istruzione if è vero, tutto ciò che è racchiuso tra le parentesi graffe viene eseguito. In questo caso, true restituisce vero, quindi il codice esegue la funzione printf.

Istruzioni if..else

In un'istruzione if...else, se il codice tra parentesi tonde dell'istruzione if è vero, viene eseguito il codice tra parentesi graffe. Ma se la condizione tra parentesi è falsa, viene eseguito tutto il codice all'interno delle parentesi graffe dell'istruzione  else.

Ovviamente, l'esempio sopra non è molto utile in questo caso perché true restituisce sempre vero. Eccone un altro un po' più pratico:

#include <stdio.h>

int main(void) {
    int n = 2;

    if(n == 3) { // compara n con 3
        printf("La condizione è Vera!\n");
    } 
    else { // se la prima condizione non è vera, vai a questo blocco di codice
        printf("La condizione è Falsa!\n");
    }

    return 0;
}

Output:

La condizione è Falsa!

Qui, ci sono alcune differenze importanti. Primo, stdbool.h non è stato incluso. Va bene perché true e false non vengono utilizzati come nel primo esempio. In C, come in altri linguaggi di programmazione, puoi utilizzare istruzioni che restituiscono vero o falso anziché utilizzare direttamente i valori booleani true o false.

Notare anche la condizione tra parentesi dell'istruzione if: n == 3. Questa condizione confronta n e il numero 3. == è l'operatore di confronto ed è una delle numerose operazioni di confronto in C.

if...else nidificato

Le istruzioni if...else consentono di scegliere tra due possibilità. Ma a volte devi scegliere tra tre o più possibilità.

Ad esempio, la funzione segno in matematica restituisce -1 se l'argomento è minore di zero, +1 se l'argomento è maggiore di zero e restituisce zero se l'argomento è zero.

Il codice seguente implementa questa funzione:

if (x < 0)
   segno = -1;
else
   if (x == 0)
      segno = 0;
   else
      segno = 1;

Come puoi vedere, una seconda istruzione if...else è annidata all'interno dell'istruzione else della prima if..else.

Se x è minore di 0, allora segno è impostato su -1. Invece, se x non è inferiore a 0, viene eseguita la seconda istruzione if...else. Lì, se x è uguale a 0, segno è anche impostato a 0. Ma se x è maggiore di 0, segno è invece impostato a 1.

Piuttosto che un'istruzione if...else nidificata, i principianti usano spesso una catena di istruzioni  if:

if (x < 0) {
   segno = -1;
}
   
if (x == 0) {
   segno = 0;
}
   
if (x > 0) {
   segno = 1;
}

Sebbene funzioni, non è consigliabile poiché non è chiaro che solo una delle istruzioni di assegnazione ( segno = ...) debba essere eseguita a seconda del valore di x. È anche inefficiente: ogni volta che il codice viene eseguito, tutte e tre le condizioni vengono verificate, anche se una o due non devono esserlo.

Istruzioni else...if

Le istruzioni if...else sono un'alternativa a una catena di istruzioni if. Considera quanto segue:

#include <stdio.h>

int main(void) {
    int n = 5;

    if(n == 5) {
        printf("n è uguale a 5!\n");
    } 
    else if (n > 5) {
        printf("n è maggiore di 5!\n");
    }

    return 0;
}

Output:

n è uguale a 5!

Se la condizione per l'istruzione if risulta falsa, la condizione per l'istruzione else...if  viene verificata. Se tale condizione restituisce vero, viene eseguito il codice all'interno delle parentesi graffe dell'istruzione else...if.

Operatori di confronto

NOME DELL'OPERATOREUTILIZZORISULTATO
Uguale aa == bTrue se aè uguale a b, false altrimenti
Non uguale aa != bTrue se adiverso da b, false altrimenti
Più grande dia > bTrue se aè maggiore di b, false altrimenti
Maggiore o uguale aa >= bTrue se aè maggiore o uguale a b, false altrimenti
Meno dia < bVero se aè minore di b, falso in caso contrario
Minore o uguale aa <= bTrue se aè minore o uguale a b, false altrimenti

Operatori logici

Potremmo voler eseguire un po' di codice se qualcosa non è vero, o se due cose sono vere. Per questo abbiamo gli operatori logici:

NOME DELL'OPERATORE UTILIZZO RISULTATO
Not ( !) !(a == 3) Vero se a è non uguale a 3
And ( &&) a == 3 && b == 6 Vero se a è uguale a 3 ed b è uguale a 6
Or ( ||) a == 2 || b == 4 Vero se a è uguale a 2 o b è uguale a 4

Per esempio:

#include <stdio.h>

int main(void) {
    int n = 5;
    int m = 10;

    if(n > m || n == 15) {
        printf("n è maggiore di m, oppure n è uguale a 15\n");
    } 
    else if( n == 5 && m == 10 ) {
        printf("n è uguale a 5 e m è uguale a 10!\n");
    } 
    else if ( !(n == 6)) {
        printf("Non è vero che n è uguale a 6!\n");
    }
    else if (n > 5) {
        printf("n è maggiore di 5!\n");
    }

    return 0;
}

Output:

n è uguale a 5 e m è uguale a 10!

Una nota importante sui confronti in C

Abbiamo accennato in precedenza che ogni confronto controlla se qualcosa è vero o falso, ma questo è vero solo in parte. C è molto leggero e vicino all'hardware su cui è in esecuzione. Con l'hardware è facile verificare se qualcosa è 0 o falso, ma verificare qualsiasi altra cosa è molto più difficile.

Invece è molto più accurato dire che i confronti stanno davvero controllando se qualcosa è 0 / false o se è un altro valore.

Ad esempio, questa istruzione if  è vera e valida:

if(12452) {
    printf("Questa è vera!\n")
}

In base alla progettazione, 0 è falso e, per convenzione, 1 è vero. Infatti, dando uno sguardo alla libreria stdbool.h:

#define false   0
#define true    1

Anche se c'è molto altro, questo è il fulcro di come funzionano i booleani e di come funziona la libreria. Queste due righe indicano al compilatore di sostituire la parola false con 0 e true con 1.