Podręcznik
1. Wyrażenia, operatory i funkcje matematyczne
1.2. Operatory arytmetyczne
Możemy wyróżnić następujące operacje arytmetyczne na zmiennych w języku C++:
- dodawanie (+),
- odejmowanie (-),
- mnożenie (*),
- dzielenie (/),
- reszta z dzielenia (%).
int x = 10;
int y = 3;
int sum = x + y; // Dodawanie: sum = 13
int difference = x - y; // Odejmowanie: difference = 7
int product = x * y; // Mnożenie: product = 30
int quotient = x / y; // Dzielenie: quotient = 3 (dzielenie całkowite)
int remainder = x % y; // Reszta z dzielenia: remainder = 1Przy omawianiu operacji podstawiania warto podać zasadę na jakiej wyznaczona jest wartość wyrażenia w podanych operacjach.
Na rysunku widzimy operację wyznaczania sumy dwóch zmiennych (1) oraz operację przypisania wartości do zmiennej. W języku C++ w [pierwszej kolejności zostanie wyznaczona wartość wyrażenia po prawej stronie (1), a dopiero w drugim kroku zostanie wykonana operacja przypisania wartości wyrażenia do zmiennej x (2).
Pomiędzy zmienną a wyrażeniem w C++ nie musi istnieć zgodność typów!
Musicie uważać, bo jeśli np. wynikiem wyrażenia jest wartość rzeczywista, a zmienna jest typu całkowitego - kompilator sam zmieni wartość rzeczywistą na całkowitą bez informowania o tym programisty - po prostu obetnie (a nie zaokrągli) część po przecinku. Można to zaobserwować na prostym przykładzie.
int a = 1;
int b = 3;
double wynik = a/b;
W wyniku operacji dzielenia liczba całkowita a zostanie podzielona na wartość b. W wyniku działania dzielenia wartości 1 przez 3 wynik powinien być liczbą zmiennoprzecinkową. W języku C++ wynik operacji dzielenia zmiennych całkowitych (
int
) jest również liczbą całkowitą, nawet jeśli wynik matematyczny jest liczbą zmiennoprzecinkową. To zachowanie jest związane z regułami typu danych używanych w operacji. Kiedy obie operandy dzielenia są typu całkowitego, wynik również będzie typu całkowitego, a ewentualna część ułamkowa zostanie odrzucona (obcięta). W tym przypadku 1 / 3
daje 0
(część ułamkowa jest odrzucona). Aby uzyskać wynik dzielenia jako liczbę zmiennoprzecinkową, co spowoduje poprawne obliczenie 1 / 3
jako 0.33333
, co najmniej jeden z operandów musi być typu zmiennoprzecinkowego (float
, double
, long double
). Można to osiągnąć na kilka sposobów:
- Rzutowanie operandów za pomocą nawiasów (ang.C-style cast)
double x = (double) a / b;
- Rzutowanie za pomocą static_cast
double x = static_cast<double>(a) / b; // lub double x = a / static_cast<double>(b);
Rzutowanie przy pomocy
static_cast
jest preferowaną metodą rzutowania w C++, ponieważ jest bardziej bezpieczne i czytelne w porównaniu do rzutowania w stylu C. C-style cast jest bardziej ryzykowne, ponieważ pozwala na konwersję między praktycznie dowolnymi typami, co może prowadzić do błędów, które są trudne do wykrycia.W trakcie implementacji aplikacji często istnieje konieczność zamiany miejscami dwóch zmiennych. Zamianę wartości pomiędzy dwiema zmiennymi można wykonać przy pomocy zmiennej pomocniczej.
W celu zamiany wartości pomiędzy zmiennymi nalezy wykonać następujące operacje:
int a = 5;
int b = 3;
int schowek = b; // zapamiętanie wartości b w zmiennej schowek (1)
b = a; // przypisanie wartości zmiennej a do zmiennej b (2)
a = schowek; // przypisanie wartości zmiennej schowek do zmiennej a (3)
Po wykonaniu operacji wartości w zmiennych zostaną zamienione wzajemnie.
Na liście operatorów istnieje jeden operator który może być mniej znany. Jest to operacja zwracająca resztę z dzielenia tzw. dzielenie modulo (%). Przykładowo 5 % 2 jest równe 1, bo reszta z dzielenia 5 przez 2 jest równa 1, zaś -11 % 3 jest równe -2. Operator na zajęciach będzie głownie wykorzystywany w celu sprawdzenia do sprawdzania podzielności argumentów całkowitych.
Liczba całkowita x jest liczbą parzystą, jeśli spełnia warunek x % 2 == 0.
Dodatkowo, dla wygody programistów, wprowadzono dodatkowe operatory przypisania, które są połączeniem wybranej operacji arytmetycznej z klasycznym operatorem przypisania. Część z nich (te, które dotyczą operacji arytmetycznych) zamieściliśmy w tabeli poniżej.
Operator | Przykład zastosowania | Klasyczny zapis operacji |
---|---|---|
+= |
a += b |
a = a + b |
-= |
a -= b |
a = a - b |
*= |
a *= b |
a = a * b |
/= |
a /= b |
a = a / b |