Operatory arytmetyczne PHP

Operatory arytmetyczne PHP stanowią dość pokaźną grupę obejmującą 8 elementów. Część z nich już znasz, bo niczym nie różnią się od podstawowych działań arytmetycznych uczonych w szkole podstawowej. Ale czy znasz wszystkie? I czy wszystkimi umiesz się w pełni posługiwać? Zaraz się przekonasz.

W tym rozdziale poznasz odpowiedzi między innymi na następujące pytania:

  1. Czym są operatory arytmetyczne?
  2. Jakie są operatory arytmetyczne w PHP?
  3. Co robi % w PHP?
  4. Jak się oblicza resztę z dzielenia w PHP?
  5. Co to jest modulo w PHP?
  6. Czym są operatory inkrementacji i dekrementacji w PHP?

Jakie są operatory arytmetyczne w PHP

W języku PHP dostępnych jest 8 operatorów arytmetycznych, służących do wykonywania podstawowych działań arytmetycznych na liczbach: dodawanie, odejmowanie, mnożenie, dzielenie, potęgowanie, obliczanie reszty z dzielenia, negacja oraz tożsamość.

Dodatkowo w języku PHP dostępne są cztery operatory, których tradycyjnie nie zalicza się do kategorii arytmetycznych. Ponieważ jednak mają zbliżone zastosowanie, ich opis również postanowiłem umieścić w tym rozdziale. Są to operatory inkrementacji i dekrementacji.

Poniższa tabela zawiera zwięzłe zestawienie wszystkich operatorów PHP opisanych w tym rozdziale.

Operatory arytmetyczne oraz inkrementacji i dekrementacji PHP
OperatorNazwaPrzykładSposób działania
+Tożsamość+$a;Operator jednoargumentowy. Zamienia wartość $a odpowiednio na liczbę typu int lub float
-Negacja-$a;Operator jednoargumentowy. Zmienia znak wartości $a na przeciwny
+Dodawanie$a + $bSumuje $a i $b
-Odejmowanie$a - $bOdejmuje wartość $b od wartości $a
*Mnożenie$a * $bMnoży wartości $a i $b
/Dzielenie$a / $bDzieli wartość $a przez wartość $b
%Dzielenie modulo (reszta z dzielenia)$a % $bZwraca resztę z dzielenia wartości $a przez wartość $b
**Potęgowanie$a ** $bZwraca wynik podniesienia $a do potęgi $b
++$xPreinkrementacja++$xZwiększa wartość $a o 1, po czym zwraca wartość $a
$x++Postinkrementacja$x++Zwraca wartość $a, po czym zwiększa wartość $a o 1
--$xPredekrementacja--$xZmniejsza wartość $a o 1, po czym zwraca wartość $a
$x--Postdekrementacja$x--Zwraca wartość $a, po czym zmniejsza wartość $a o 1

W większości przypadków operatory te działają dokładnie tak, jak można się spodziewać, czyli zgodnie z podstawowymi zasadami matematyki. Istnieją jednak pewne niuanse, o których warto wiedzieć.

Działania na liczbach różnego typu

Jeśli w operacji arytmetycznej biorą udział dwie liczby tego samego typu, np. dwie liczby typu int albo dwie liczby typu float, to wynik również jest tego typu, np.:


var_dump(10 + 12); // Wynik: int(22)

W przypadku argumentów typu int może zostać zwrócona wartość typu float. Dzieje się tak w przypadku, gdy wynik operacji nie mieści się w zakresie wartości tego typu. Zakres ten można sprawdzić przy użyciu stałej PHP_INT_MAX.

Jeśli natomiast przynajmniej jeden z argumentów działania jest typu float, to wynik działania również jest typu float, np.:


var_dump(10 * 2 + 12 - 2.5); // Wynik: float(29.5)

Działania na liczbach i łańcuchach

Jeśli argumentami działania arytmetycznego są liczba i łańcuch, to PHP próbuje przekonwertować ten łańcuch na typ liczbowy. Jeśli się mu uda, to wykona normalne działanie na dwóch liczbach i zwróci wynik odpowiedniego typu, np.:


var_dump(10 + "12"); // Wynik: int(22)
var_dump(10 + "16.8"); // Wynik: float(26.8)
var_dump(10 + "12" - 6 * "4" / 3); // Wynik: int(14)
var_dump(10 + "12e3"); // Wynik: float(12010)

Jeśli jednym z argumentów działania arytmetycznego jest liczba, a drugim tzw. łańcuch z wiodącą częścią liczbową (ang. leading numeric string), to PHP wykona działanie przy użyciu liczby wyłuskanej z tego łańcucha, ale dodatkowo zgłosi ostrzeżenie, np.:


var_dump(10 + "123abc");

Wynik:

Warning: A non-numeric value encountered in C:\xampp\htdocs\index.php on line 29
int(133)

Oczywiście ścieżka do pliku i numer wiersza mogą być inne. Tutaj widzisz, jak to wyglądało w mojej konfiguracji testowej.

Jeżeli natomiast jeden z argumentów operatora arytmetycznego nie będzie liczbą ani łańcuchem, który da się przekonwertować na liczbę, interpreter PHP zgłosi błąd krytyczny i nie wykona działania, np.:


var_dump(10 + "abc");

Wynik:

Fatal error: Uncaught TypeError: Unsupported operand types: int + string in C:\xampp\htdocs\index.php:29 Stack trace: #0 {main} thrown in C:\xampp\htdocs\index.php on line 29

Dzielenie w PHP

Operator dzielenia PHP dzieli pierwszy argument przez drugi. Jeśli oba argumenty są typu int lub zostaną zinterpretowane jako typu int oraz nie ma reszty z dzielenia, to wynik jest typu całkowitoliczbowego, np.:


var_dump(10 / 5); // Wynik: int(2)
var_dump(10 / "5aaa"); // Wynik: int(2)
var_dump(10 / 3); // Wynik: float(3.3333333333333335)

W drugim z tych przypadków interpreter dodatkowo wyda ostrzeżenie, że napotkał wartość, która nie jest liczbą, ale mimo to wykona działanie.

Operator dzielenia PHP wykonuje dzielenie zmiennoprzecinkowe, w wyniku którego możemy otrzymać liczbę ułamkową.

Jeśli chcesz sprawdzić, ile razy jedna liczba mieści się w innej w całości, czyli jeśli chcesz wykonać dzielenie całkowite, to możesz użyć funkcji PHP intdiv(), np.:


var_dump(intdiv(15, 6)); // Wynik: int(2)
var_dump(intdiv(-19, 3));  // Wynik: int(-6)

I oczywiście próba dzielenia przez 0 zakończy się błędem krytycznym:

$a = 10 / 0; // Wynik: Fatal error: Uncaught DivisionByZeroError: Division by zero…

Jak już wiesz, operator dzielenia PHP wykonuje dzielenie zmiennoprzecinkowe, a funkcja intdiv() odrzuca resztę z dzielenia i zwraca tylko część całkowitą wyniku. Ale czy wiesz, że w PHP istnieje analogiczny zestaw operatora i funkcji, który działa dokładnie odwrotnie? Składa się on z operatora dzielenia modulo (%) i funkcji fmod().

Dzielenie modulo w PHP

Choć nazwa dzielenie modulo może nasuwać skojarzenie z czymś trudnym i skomplikowanym, w rzeczywistości kryje się za nią bardzo proste działanie arytmetyczne.

Polega ono na wykonaniu dzielenia całkowitego pierwszego argumentu przez drugi i zwróceniu tylko reszty z tej operacji. Operator dzielenia modulo PHP ma postać znaku procenta (%), np.:


var_dump(10 % 3); // Wynik: int(1)
var_dump(37 % 14); // Wynik: int(9)
var_dump(-13 % 5); // Wynik: int(-3)
var_dump(13 % -5); // Wynik: int(3)

Zwróć uwagę na wyniki dwóch ostatnich przykładów, w których pokazałem dzielenie modulo z udziałem argumentów ujemnych. Wynik dzielenia modulo w PHP ma zawsze taki sam znak, jak dzielna, czyli pierwszy argument.

Operator dzielenia modulo PHP wykonuje całkowite dzielenie modulo, które polega na tym, że najpierw zostaje usunięta część ułamkowa argumentów, a dopiero po tym zostaje wykonana operacja, np.:


var_dump(7 % 3.5); // Wynik: int(1)

W tym przykładzie część ułamkowa wartości 3.5 zostanie odrzucona przed wykonaniem działania, więc w rzeczywistości zostanie wykonana operacja 7 % 3. Stąd mamy 1 w wyniku.

Jeśli chcesz wykonać zmiennoprzecinkowe dzielenie modulo w PHP, to możesz użyć funkcji fmod(), np.:


var_dump(fmod(10, 3.4)); // Wynik: float(3.2)

Skąd wziął się ten wynik? Aby to zrozumieć, najprościej jest dodawać do siebie liczbę 3,4 aż do osiągnięcia liczby większej od 10.

Zatem 3,4 + 3,4 = 6,8, więc idziemy dalej. 3,4 + 3,4 + 3,4 = 10,2, więc już wiemy, że liczba 3,4 w liczbie 10 w całości mieści się tylko dwa razy. W związku z tym bierzemy sumę dwóch liczb 3,4 i odejmujemy ją od liczby 10: 10 − 6,8 = 3,2.

Pamiętaj też o kwestii precyzji liczb zmiennoprzecinkowych w PHP. Jeśli o niej zapomnisz, wynik może cię zaskoczyć, np.:


var_dump(fmod(9.67, 3.14)); // Wynik: float(0.24999999999999956)

W tym przypadku spodziewaliśmy się wyniku 0,25, ponieważ 3,14 × 3 = 9,42; a 9,67 − 9,42 = 0,25. Jednak brak możliwości precyzyjnego reprezentowania niektórych liczb zmiennoprzecinkowych w pamięci komputera spowodował, że otrzymaliśmy tylko przybliżony wynik.

To tyle, jeśli chodzi o operatory arytmetyczne PHP. Choć jest parę niuansów, o których należy pamiętać podczas ich używania, w zdecydowanej większości przypadków używa się ich po prostu intuicyjnie.

Teraz przejdziemy do wspomnianych na początku operatorów inkrementacji i dekrementacji. Początkującego programistę mogą przerażać samą swoją nazwą. Sprawdźmy więc, czy naprawdę jest się czego bać.

wąż atakujący kobietę, modulo php
Choć nazwy działań inkrementacja i dekrementacja brzmią dość strasznie, to w rzeczywistości oznaczają bardzo proste operacje

Operatory inkrementacji i dekrementacji

Co to jest inkrementacja i dekrementacja w PHP? Pod tymi nazwami kryją się bardzo proste operacje — odpowiednio zwiększanie wartości o 1 i zmniejszanie wartości o 1 (więc już wiesz, że nie ma się czego bać).

Jaki jest symbol inkrementacji? Operatorem inkrementacji są dwa znaki plus (++), które można umieścić przed nazwą zmiennej, jest to wtedy operator preinkrementacji, lub za nazwą zmiennej, i wtedy jest to operator postinkrementacji (za chwilę wyjaśnię, czym się różnią).

W każdym przypadku jest to operator jednoargumentowy. Może on być oddzielony od nazwy zmiennej spacjami, ale zwyczajowo (i zgodnie z zaleceniem standardu PSR-12: Extended Coding Style) umieszcza się go bezpośrednio obok niej, np.:


$a = 10;
$a++;

Po wykonaniu tych instrukcji zmienna $a będzie miała wartość 11.

A jaki jest symbol dekrementacji? Jak być może się domyślasz, skoro dla inkrementacji zarezerwowano dwa plusy, to dla dekrementacji, która jest operacją przeciwną, zarezerwowano dwa minusy (ten operator również jest jednoargumentowy i występuje w dwóch wersjach — predekrementacji i postdekrementacji), np.:


$b = 10;
--$b;

Po wykonaniu tych instrukcji zmienna $b będzie miała wartość 9.

Jaka jest więc różnica między wersjami z przedrostkiem pre- a wersjami z przedrostkiem post- w nazwie?

Przedrostek pre- oznacza przed, a post- oznacza po. Zatem różnica między tymi dwiema wersjami tych operatorów dotyczy momentu wykonania reprezentowanych przez nie operacji.

Operacja ta może zostać wykonana przed zwróceniem zmiennej (w przypadku wersji pre-) lub po jej zwróceniu (w przypadku wersji post-). W efekcie w bieżącym wyrażeniu otrzymamy odpowiednio wartość zmiennej zmienioną o 1 lub jeszcze niezmienioną. Najłatwiej to zrozumieć na konkretnym przykładzie:

$a = 10;
echo $a; // Wynik: 10
echo $a++; // Wynik: 10
echo $a; // Wynik: 11

Rozumiesz, dlaczego wyniki są takie? Użyty tu został operator postinkrementacji. Przeanalizujemy ten kod krok po kroku.

  1. W 1. wierszu utworzyliśmy zmienną o nazwie $a i nadaliśmy jej wartość 10.
  2. W 2. wierszu wyświetliliśmy wartość naszej zmiennej, która wynosi 10.
  3. W 3. wierszu najpierw wyświetliliśmy wartość zmiennej, 10, a następnie zwiększyliśmy ją o 1 i zwróciliśmy tę zmienną.
  4. W 4. wierszu znowu wyświetliliśmy wartość zmiennej $a, która teraz wynosi już 11.

A teraz przeanalizujemy analogiczny przykład, z użyciem operatora preinkrementacji:

$a = 10;
echo $a; // Wynik: 10
echo ++$a; // Wynik: 11
echo $a; // Wynik: 11

Przyjrzyjmy się tym instrukcjom po kolei:

  1. W 1. wierszu utworzyliśmy zmienną o nazwie $a i nadaliśmy jej wartość 10.
  2. W 2. wierszu wyświetliliśmy wartość naszej zmiennej, która wynosi 10.
  3. W 3. wierszu najpierw zwiększyliśmy wartość zmiennej do 11, a następnie ją wyświetliliśmy, po czym zwróciliśmy tę zmienną.
  4. W 4. wierszu znowu wyświetliliśmy wartość zmiennej $a, która nadal wynosi 11.

Operator dekrementacji działa w identyczny sposób, tylko zamiast zwiększać wartość zmiennej o jeden, zmniejsza ją o jeden.

diabełek czytający książkę, operatory arytmetyczne php, modulo php

To wszystko. Cała filozofia. Proste jak kawałek sznurka w kieszeni. Okazuje się, że jednak nie taki diabeł straszny, jak go malują. To znaczy, jak brzmi jego imię…

Na tym zakończymy rozdział o operatorach arytmetycznych, w którym poznałeś wszystkie operatory arytmetyczne PHP oraz operatory inkrementacji i dekrementacji PHP, a także dowiedziałeś się, że trudne słowa nie zawsze oznaczają trudne pojęcia.

Aby utrwalić wiadomości, koniecznie przeczytaj podsumowanie oraz odpowiedz na pytania kontrolne i wykonaj ćwiczenia.

W następnym rozdziale opowiem ci o operatorach porównań. Czy wiesz na przykład, jak sprawdzić w skrypcie, czy wartość zmiennej $a jest większa od wartości zmiennej $b? Jeśli nie, to wkrótce się dowiesz!

Podsumowanie

  1. W języku PHP jest 8 operatorów arytmetycznych: tożsamość (+ jednoargumentowy), negacja (- jednoargumentowy), dodawanie (+ dwuargumentowy), odejmowanie (- dwuargumentowy), mnożenie (*), dzielenie (/), dzielenie modulo (%) oraz potęgowanie (**).
  2. Ponadto w PHP są 4 operatory inkrementacji i dekrementacji: dwa operatory inkrementacji (++) i dwa operatory dekrementacji (--).
  3. Jeśli przynajmniej jeden z argumentów działania arytmetycznego jest typu float, to wynik też jest typu float.
  4. W PHP można wykonywać działania arytmetyczne na liczbach i łańcuchach reprezentujących liczby.
  5. Do wykonywania dzielenia całkowitego służy funkcja PHP intdiv().
  6. Do wykonywania zmiennoprzecinkowego dzielenia modulo służy funkcja PHP fmod().
  7. Wynik dzielenia modulo w PHP ma zawsze taki sam znak, jak pierwszy argument tej operacji.
  8. Operator preinkrementacji najpierw zwiększa wartość zmiennej, a potem ją zwraca.
  9. Operator postinkrementacji najpierw zwraca wartość zmiennej, a potem ją zwiększa.
  10. Operator predekrementacji najpierw zmniejsza wartość zmiennej, a potem ją zwraca.
  11. Operator postdekrementacji najpierw zwraca wartość zmiennej, a potem ją zmniejsza.



Pytania

  1. Jakie operatory arytmetyczne są dostępne w PHP?
  2. Co to jest inkrementacja i dekrementacja? Jak wyglądają operatory tych operacji?
  3. Czym różni się preinkrementacja od postinkrementacji oraz predekrementacja od postdekrementacji?
  4. Jaki jest typ wyniku działania arytmetycznego, jeśli oba argumenty są typu int? O czym należy pamiętać w tym przypadku?
  5. Jaki jest wynik działania arytmetycznego, jeśli przynajmniej jeden z argumentów jest typu float?
  6. Czy w PHP można wykonywać działania arytmetyczne na liczbach i łańcuchach?
  7. Jaka funkcja służy do wykonywania dzielenia całkowitego?
  8. Jaka funkcja służy do wykonywania zmiennoprzecinkowego dzielenia modulo?
  9. Jaki jest znak dzielenia modulo w PHP?



Ćwiczenia

Wykonaj za pomocą PHP następujące operacje. Wyniki zapisz w zmiennych i wyświetl je na stronie internetowej:

  1. 3,4 + 23
  2. 0,1 + 0,3
  3. Zdefiniuj zmienną o wartości 22, a następnie zwiększ jej wartość o 1.
  4. Oblicz resztę z dzielenia liczby 45 przez 7.
  5. Oblicz resztę z dzielenia liczby 78,12 przez 33,5.
  6. Zmniejsz wynik poprzedniego działania o 1.

Podobał Ci się ten artykuł?

Oceń go!

Średnia 5 / 5. Liczba głosów: 2

Jeszcze nikt nie głosował. Wyprzedź innych i zagłosuj.

Skoro spodobał Ci się ten artykuł...

Poleć go znajomym!

Ojej :( Powiedz nam, co powinniśmy poprawić!

Podoba Ci się ta strona?

Pomóż nam się rozwijać, wykupując płatne konto. Dzięki temu będziemy mogli tworzyć dla Ciebie jeszcze więcej ciekawych treści, a Ty pozbędziesz się reklam.

Subskrybuj
Powiadom o
guest

0 Komentarze
Najstarsze
Najnowsze Najwięcej głosów
Opinie w linii
Zobacz wszystkie komentarze
0
Chętnie poznam Twoje przemyślenia, skomentuj.x