1. Introduzione
Partiamo da un'analogia quotidiana. Immagina una ricetta:
Mescola la farina, le uova e lo zucchero sbatti aggiungi il burro sbatti ancora.
Suona strano? Ora immagina che tra le parole "sbatti" e "aggiungi" ci sia una virgola o delle parentesi. L'ordine delle azioni diventa subito più chiaro.
Nel coding succede una cosa simile quando scrivi un'espressione complessa:
bool result = a > 0 && b < 10 || c == 3;
Qual è l'ordine? Cosa viene calcolato prima: a > 0 && b < 10, poi || c == 3? O il contrario? Senza un ordine di calcolo chiaro il computer può "confondere gli ingredienti" e il tuo risultato sarà inaspettato.
2. Priorità degli operatori in C#
C# (come la maggior parte dei linguaggi di programmazione) usa una tabella di priorità degli operatori.
Gli operatori con priorità più alta vengono eseguiti prima di quelli con priorità più bassa.
Dai un'occhiata alla parte più importante di questa tabella (per le espressioni condizionali):
| Operatore | Descrizione | Priorità |
|---|---|---|
| () | Parentesi | la più alta |
| ! | Logico "NON" | alta |
| ==, != | Uguale / diverso | media |
| <, >, <=, >= | Confronti | media |
| && | Logico "E" | più bassa |
| || | Logico "O" | ancora più bassa |
(Ci sono anche operatori aritmetici — hanno priorità più alta di quelli logici.)
La regola principale
Gli operatori "E" (&&) hanno priorità più alta di "O" (||),
cioè prima viene calcolato "E", poi "O".
Schema a blocchi del calcolo della priorità delle condizioni
In pratica: a > 0 && b < 10 || c == 3 — prima si calcola a > 0 && b < 10, poi il risultato viene confrontato con c == 3 tramite ||.
3. Direzione degli operatori: da sinistra a destra e viceversa
Oltre alla priorità, c'è anche questa parola: associatività.
Questa regola dice in che direzione vengono calcolati gli operatori se sono "vicini" e hanno la stessa priorità.
Esempio:
bool a = true, b = false, c = true;
bool result = a && b && c;
Domanda: come viene calcolato?
Risposta: l'associatività di && è da sinistra a destra.
Quindi prima a && b, poi il risultato con c.
Applicato alle condizioni:
| Operatore | Associatività |
|---|---|
| &&, || | da sinistra a destra |
| ! | da destra a sinistra |
4. Le parentesi — il tuo migliore amico nelle condizioni complesse
Qui inizia la magia (e la salvezza). Quando scrivi un'espressione, le parentesi cambiano la priorità e rendono il tuo codice più chiaro e sicuro.
Esempio 1 (senza parentesi):
// Vogliamo: "Se l'utente è adulto e cittadino, oppure se ha un permesso speciale"
bool isAdult = age >= 18;
bool isCitizen = country == "Bielorussia";
bool hasPermit = hasSpecialPass == true;
if (isAdult && isCitizen || hasPermit)
{
Console.WriteLine("Accesso consentito!");
}
Come calcola C#:
Prima calcola isAdult && isCitizen, poi confronta il risultato con || e hasPermit.
- Supponiamo, isAdult = true, isCitizen = false, hasPermit = true
isAdult && isCitizen→true && false→falsefalse || true→true
Cioè, se una persona ha un permesso speciale, viene comunque fatta passare.
E se non ha il permesso, ma è un adulto cittadino — viene fatta passare lo stesso.
Esempio 2 (con parentesi):
if (isAdult && (isCitizen || hasPermit))
{
Console.WriteLine("Accesso consentito!");
}
Ora il programma controlla prima:
isCitizen || hasPermit, e poi questo risultato insieme a isAdult.
Cioè devi essere adulto e (o cittadino, o avere un permesso speciale).
Una piccola differenza nelle parentesi — una grande differenza nella logica!
GO TO FULL VERSION