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'OPERATORE | UTILIZZO | RISULTATO |
---|---|---|
Uguale a | a == b | True se a è uguale a b , false altrimenti |
Non uguale a | a != b | True se a diverso da b , false altrimenti |
Più grande di | a > b | True se a è maggiore di b , false altrimenti |
Maggiore o uguale a | a >= b | True se a è maggiore o uguale a b , false altrimenti |
Meno di | a < b | Vero se a è minore di b , falso in caso contrario |
Minore o uguale a | a <= b | True 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.