1. Wprowadzenie
Zacznijmy od życiowej analogii. Wyobraź sobie przepis:
Wymieszaj mąkę, jajka i cukier ubij dodaj masło ubij jeszcze raz.
Wygląda dziwnie? A teraz wyobraź sobie, że między słowami "ubij" i "dodaj" stoi przecinek albo nawias. Kolejność działań od razu robi się jaśniejsza.
W programowaniu jest podobnie, gdy piszesz złożone wyrażenie:
bool result = a > 0 && b < 10 || c == 3;
Jaka kolejność? Co liczy się pierwsze: a > 0 && b < 10, potem || c == 3? Czy może odwrotnie? Bez jasnej kolejności komputer może "pomieszać składniki" i wynik będzie zaskakujący.
2. Priorytet operatorów w C#
C# (jak większość języków programowania) używa określonej tabeli priorytetów operatorów.
Operatory o wyższym priorytecie wykonują się wcześniej niż te o niższym.
Spójrz na najważniejszą część tej tabeli (dla wyrażeń warunkowych):
| Operator | Opis | Priorytet |
|---|---|---|
| () | Nawiasy | najwyższy |
| ! | Logiczne "NIE" | wysoki |
| ==, != | Równe / nierówne | średni |
| <, >, <=, >= | Porównania | średni |
| && | Logiczne "I" | niższy |
| || | Logiczne "LUB" | jeszcze niższy |
(Są jeszcze operatory arytmetyczne — one mają wyższy priorytet niż logiczne.)
Najważniejsza zasada
Operator "I" (&&) ma wyższy priorytet niż "LUB" (||),
czyli najpierw liczy się "I", potem "LUB".
Schemat blokowy obliczania priorytetu warunków
W praktyce: a > 0 && b < 10 || c == 3 — najpierw liczy się a > 0 && b < 10, potem wynik porównuje się z c == 3 przez ||.
3. Kierunek operatorów: od lewej do prawej i odwrotnie
Oprócz priorytetu jest jeszcze takie słowo: asocjatywność.
To zasada, w jakim kierunku liczą się operatory, jeśli stoją "obok siebie" i mają ten sam priorytet.
Przykład:
bool a = true, b = false, c = true;
bool result = a && b && c;
Pytanie: jak to się policzy?
Odpowiedź: asocjatywność dla && — od lewej do prawej.
Czyli najpierw a && b, potem wynik z c.
W odniesieniu do warunków:
| Operator | Asocjatywność |
|---|---|
| &&, || | od lewej do prawej |
| ! | od prawej do lewej |
4. Nawiasy — twój najlepszy ziomek w złożonych warunkach
I tu zaczyna się magia (i ratunek). Gdy piszesz wyrażenie, nawiasy zmieniają priorytet i robią twój kod czytelniejszym i bezpieczniejszym.
Przykład 1 (bez nawiasów):
// Chcemy: "Jeśli użytkownik jest dorosły i obywatelem, albo jeśli ma specjalną przepustkę"
bool isAdult = age >= 18;
bool isCitizen = country == "Białoruś";
bool hasPermit = hasSpecialPass == true;
if (isAdult && isCitizen || hasPermit)
{
Console.WriteLine("Dostęp dozwolony!");
}
Jak liczy C#:
Najpierw liczy isAdult && isCitizen, potem wynik porównuje przez || z hasPermit.
- Załóżmy, isAdult = true, isCitizen = false, hasPermit = true
isAdult && isCitizen→true && false→falsefalse || true→true
Czyli jeśli ktoś ma specjalną przepustkę, i tak go wpuszczą.
A jeśli bez przepustki, ale dorosły obywatel — też go wpuszczą.
Przykład 2 (z nawiasami):
if (isAdult && (isCitizen || hasPermit))
{
Console.WriteLine("Dostęp dozwolony!");
}
Teraz program najpierw sprawdza:
isCitizen || hasPermit, a potem ten wynik razem z isAdult.
Czyli musisz być dorosły i (albo obywatelem, albo mieć specjalną przepustkę).
Mała różnica w nawiasach — ogromna różnica w logice!
GO TO FULL VERSION