Operatory i równość
Operatory to symbole, którymi wykonujemy działania: liczenie, porównywanie i łączenie
warunków. Poznasz operatory arytmetyczne, przypisania, porównania i logiczne, a także
ważne rozróżnienie: == (równość wartości) kontra ===
(ten sam obiekt).
Operatory arytmetyczne
Służą do wykonywania działań na liczbach:
| Operator | Działanie | Przykład |
|---|---|---|
+ | Dodawanie | 5 + 3 → 8 |
- | Odejmowanie | 5 - 3 → 2 |
* | Mnożenie | 5 * 3 → 15 |
/ | Dzielenie | 17 / 5 → 3 (całkowite!) |
% | Reszta z dzielenia (modulo) | 17 % 5 → 2 |
val a = 17 val b = 5 println("Suma: ${a + b}") // 22 println("Różnica: ${a - b}") // 12 println("Iloczyn: ${a * b}") // 85 println("Iloraz: ${a / b}") // 3 (dzielenie całkowite) println("Reszta: ${a % b}") // 2
Operator % zwraca resztę z dzielenia. Najczęstsze zastosowanie to
sprawdzanie parzystości: jeśli liczba % 2 == 0,
liczba jest parzysta. Przyda się też do „zawijania” wartości (np. dni tygodnia).
Operatory przypisania
Znak = przypisuje wartość. Operatory złożone (+=,
-=…) to skrót: „weź obecną wartość, wykonaj działanie, zapisz wynik
z powrotem”. Działają tylko na zmiennych var.
| Zapis | To samo co |
|---|---|
x += 5 | x = x + 5 |
x -= 5 | x = x - 5 |
x *= 5 | x = x * 5 |
x /= 5 | x = x / 5 |
x++ | x = x + 1 (zwiększ o 1) |
x-- | x = x - 1 (zmniejsz o 1) |
var suma = 0 suma += 5 // 5 suma += 3 // 8 suma *= 2 // 16 var licznik = 0 licznik++ // 1 licznik++ // 2 licznik-- // 1
Operatory porównania
Porównują dwie wartości i zwracają wynik logiczny Boolean
(true albo false):
| Operator | Znaczenie |
|---|---|
< | mniejsze niż |
> | większe niż |
<= | mniejsze lub równe |
>= | większe lub równe |
== | równe (taka sama wartość) |
!= | różne |
val a = 5 val b = 8 println(a < b) // true println(a > b) // false println(a == b) // false println(a != b) // true
Wyniki porównań wykorzystamy w instrukcjach warunkowych (temat z bloku o sterowaniu przepływem).
== kontra === – dwa rodzaje równości
Kotlin rozróżnia dwa pytania o „równość”, które łatwo pomylić:
| Operator | Pyta o… | Nazwa |
|---|---|---|
== | Czy wartości są takie same? | równość strukturalna |
=== | Czy to dokładnie ten sam obiekt w pamięci? | równość referencyjna |
Dwa różne pudełka mogą zawierać identyczną zawartość. ==
sprawdza zawartość, === sprawdza, czy to fizycznie to samo pudełko.
val imie = "Anna" val czesc = "An" val zlozone = czesc + "na" // "Anna" zbudowane z kawałków = nowy obiekt println(imie == zlozone) // true – ta sama treść ("Anna") println(imie === zlozone) // false – to dwa różne obiekty w pamięci
Gdy chcesz sprawdzić, czy dwie rzeczy mają taką samą wartość (a tego chcesz
niemal zawsze), używaj ==. Operator === jest potrzebny
rzadko – dopiero wtedy, gdy świadomie pytasz, czy to dosłownie ten sam obiekt.
Z tego, że == daje true, nie wynika,
że === też. Odwrotnie jest pewne: jeśli to ten sam obiekt
(=== true), to i wartości są równe (== true).
Operatory logiczne
Łączą lub odwracają warunki (wartości Boolean). Pozwalają zbudować
bardziej złożone pytania niż pojedyncze porównanie.
| Operator | Znaczenie | Daje true, gdy… |
|---|---|---|
&& | I (oba naraz) | oba warunki są prawdziwe |
|| | LUB (co najmniej jeden) | przynajmniej jeden warunek jest prawdziwy |
! | NIE (zaprzeczenie) | odwraca wartość: z true robi false |
val wiek = 17 // && – oba warunki muszą być spełnione println(wiek >= 13 && wiek <= 19) // true – nastolatek // || – wystarczy jeden warunek val pora = "noc" println(pora == "dzień" || pora == "noc") // true // ! – zaprzeczenie println(!(wiek >= 18)) // true – NIE jest pełnoletni
Przy łączeniu warunków musisz powtórzyć nazwę zmiennej po każdej
stronie. Zapis wiek >= 13 && wiek <= 19 jest poprawny;
skrótu w stylu 13 <= wiek <= 19 Kotlin nie rozumie.
Kolejność (priorytet) operatorów
Tak jak w matematyce, niektóre operatory wykonują się przed innymi. Od najwyższego do najniższego priorytetu:
| Kolejność | Operatory |
|---|---|
| 1 (pierwsze) | ! (negacja) |
| 2 | * / % |
| 3 | + - |
| 4 | < <= > >= |
| 5 | == != |
| 6 | && |
| 7 (ostatnie) | || |
println(2 + 3 * 4) // 14 (* przed +) println((2 + 3) * 4) // 20 (nawiasy zmieniają kolejność)
Nie musisz znać całej tabeli na pamięć. Gdy wyrażenie robi się złożone, dodaj nawiasy – kod stanie się jednoznaczny i czytelniejszy.
Częste błędy
❌ Błąd 1: = zamiast == w porównaniu
❌ Jeden znak równości
val x = 5 println(x = 5) // Błąd! = to przypisanie, // nie porównanie
✅ Podwójny znak równości
val x = 5 println(x == 5) // true
❌ Błąd 2: === gdy chodzi o wartość
❌ Porównanie obiektów zamiast treści
val a = "An" + "na" val b = "An" + "na" println(a === b) // może dać false – // to różne obiekty
✅ Porównanie wartości
val a = "An" + "na" val b = "An" + "na" println(a == b) // true – ta sama treść
❌ Błąd 3: brak powtórzenia zmiennej w warunku
❌ Skrót jak w matematyce
val w = 15 println(13 <= w <= 19) // Błąd! tak się nie da
✅ Dwa pełne warunki przez &&
val w = 15 println(w >= 13 && w <= 19) // true
❌ Błąd 4: dzielenie całkowite przez zero
❌ Int dzielone przez 0
val x = 10 / 0 // Błąd w czasie działania! // nie można dzielić // liczb całkowitych przez 0
✅ Najpierw sprawdź dzielnik
val dzielnik = 0
if (dzielnik != 0) {
println(10 / dzielnik)
}
// dzielimy tylko gdy != 0
Podsumowanie
- Arytmetyczne:
+ - * /oraz%(reszta). Pamiętaj o dzieleniu całkowitym. - Przypisania:
=oraz skróty+= -= *= /=;++zwiększa,--zmniejsza o 1. - Porównania
< > <= >= == !=zwracająBoolean. ==– równość wartości (strukturalna);===– ten sam obiekt (referencyjna). Na co dzień używasz==.- Logiczne:
&&(oba),||(co najmniej jeden),!(zaprzeczenie). Każdy warunek to osobne porównanie. - Operatory mają priorytet (
*przed+itd.); w razie wątpliwości używaj nawiasów.
Zadania do wykonania
Zadania wykonaj w Kotlin Playground (play.kotlinlang.org).
Zadeklaruj dwie liczby całkowite. Wypisz ich sumę, różnicę, iloczyn, iloraz
oraz resztę z dzielenia (%) – każde działanie w osobnej linii.
Zadeklaruj var punkty = 0. Za pomocą operatorów +=
i ++ zmień jego wartość kilka razy, wypisując stan po każdej zmianie.
Zadeklaruj liczbę i sprawdź dwoma osobnymi wyrażeniami logicznymi: czy mieści się
w zakresie od 1 do 100 (>= 1 && <= 100) oraz czy jest
parzysta (% 2 == 0). Wypisz oba wyniki typu Boolean.
Napisz fragment, który dla zadanej liczby wypisze true, jeśli jest
ona parzysta i większa od 10, a w przeciwnym razie false.
Następnie zbuduj drugie wyrażenie z ||: liczba jest podzielna przez 3
lub przez 5. Przetestuj na kilku liczbach.