Le espressioni relazionali

Le espressioni relazionali sono quelle espressioni che utilizziamo per verificare una condizione, come abbiamo visto ad esempio nel while().

Gli operatori utilizzati all'interno di queste espressioni sonno detti operatori relazionali.
Abbiamo già visto l'operatore > "maggiore di", ma elenchiamoli tutti:

< "minore di ... "

<= "minore o uguale a ... "

> "maggiore di ... "

>= "maggiore o uguale a ... "

== "uguale a ... "

!= "diverso da ... "

La prima cosa che salta all'occhio è l'operatore di eguaglianza == ed è giusto spendere qualche parola a riguardo.

Facciamo un esempio per chiarire meglio il suo utilizzo:
int varVita = 100; //assegna il valore 100 a varVita

while(varVita == 100) //finché varVita è uguale a 100
{
    cout << "HAI IL MASSIMO DELLA VITA!";
}
Ci aspetteremmo che per verificare un eguaglianza si usasse un solo simbolo uguale = .

Tuttavia nel C++ il simbolo uguale svolge un altro compito che conosciamo bene, che è quello di assegnare un valore ad una variabile. Quest'operatore è detto operatore di assegnazione.

Mentre per verificare un eguaglianza si utilizza l'operatore di eguaglianza, che è formato da due simboli di uguale == !
E' facile confondersi, tant'è che succede spesso anche ai programmatori esperti di sbagliarsi e scrivere un singolo = invece di due.

Ipotizziamo che il nostro personaggio è stato colpito, quindi la sua vita è dimezzata.
In teoria non dovrebbe essere mostrata la scritta "HAI IL MASSIMO DELLA VITA", perché la condizione varVita == 100 non si verifica ed il codice all'interno del blocco del ciclo while() non viene eseguito.
int varVita = 50; //il nostro personaggio ha solo 50 punti vita

while(varVita == 100) //finché varVita è uguale a 100
{
    cout << "HAI IL MASSIMO DELLA VITA!";
}
Ovviamente la scritta "HAI IL MASSIMO DELLA VITA" non verrà mai mostrata, perché la condizione varVita == 100 è falsa, in quanto varVita ora è 50, ed il codice all'interno del blocco (l'istruzione cout) non verrà eseguito.

Vediamo però cosa succede se al posto di == usiamo un singolo = :
int varVita = 50; //il nostro personaggio ha solo 50 punti vita

while(varVita = 100) //assegna il valore 100 a varVita
{
    cout << "HAI IL MASSIMO DELLA VITA!";
}
Se compiliamo ed eseguiamo questo programma vedremo che mostrerà a schermo la scritta "HAI IL MASSIMO DELLA VITA!".
Ma come è possibile? Abbiamo detto al ciclo while di eseguire il blocco di codice finché varVita è uguale a 100, ma noi l'abbiamo impostata a 50!
Aspetta un attimo! Dannazione, abbiamo utilizzato l'operatore di assegnazione al posto dell'operatore di eguaglianza!
Questo è un errore di distrazione che capita spesso, perciò se durante la scrittura di un programma qualcosa non funziona, la prima cosa da verificare è che non ci siano errori di questo tipo.

Questo succede perché all'interno delle parentesi tonde del while, invece di verificare una condizione, viene eseguita un'istruzione di assegnamento, e cioé varVita viene impostata a 100, dopodiché il while, non avendo condizioni da verificare, esegue il suo contenuto all'infinito.
Sarebbe un po' come scrivere:
while()
{
    //...codice...
}
Non avendo condizioni da verificare, il ciclo while viene eseguito sempre, e quindi non termina mai.

L'opposto dell'operatore di eguaglianza è l'operatore di diseguaglianza, che fa sì che il codice all'interno del blocco sia eseguito sinché una variabile è diversa dal valore specificato.
Facciamo un esempio con un minimo di interazione:
char varChar; //variabile necessaria per memorizzare l'input da tastiera

while(varChar != 'x')
{
    cout << "Sei all'interno del ciclo while." << endl;
    cout << "Premi il tasto x per uscire dal ciclo." << endl;
    cin >> varChar; //attende l'input da tastiera
}
cout << "Hai premuto il tasto x. Sei fuori dal loop."
Il codice esegue il ciclo while sinché l'utente non preme il tasto x della tastiera.
Provate ad eseguirlo e a premere lettere a caso, e vedrete che il programma continua a stampare il contenuto del blocco ogni volta che premete una lettera diversa da x.
Nel momento in cui premerete il tasto x il ciclo terminerà e verrà eseguita l'espressione successiva, che mostrerà a schermo la frase "Hai premuto il tasto x. Sei fuori dal loop.".

Questo avviene perché l'espressione relazionale dice "esegui il codice all'interno del blocco sinché varChar è diversa dal carattere x".

Come potete vedere l'utilizzo di queste espressioni è molto intuitivo, se avete qualche piccolo dubbio vedrete che andrà via con un po' di pratica.
E' inutile a questo punto descrivere il funzionamento degli altri quattro operatori relazionali, poiché si commentano da soli.

Nessun commento:

Posta un commento