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 (%).
Poniżej przykładowe operacje arytmetyczne:
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:
  1. Rzutowanie operandów za pomocą nawiasów (ang.C-style cast)
    double x = (double) a / b;
    
  2. Rzutowanie za pomocą static_cast
    double x = static_cast<double>(a) / b;
    // lub
    double x = a / static_cast<double>(b);
    
Rzutowanie za pomocą nawiasów jest prostą metodą przekształcania typów w C++, ale może być mniej czytelne i bezpieczne niż inne metody dostępne w C++. Niemniej jednak, jest to standardowy sposób rzutowania, który jest wciąż często używany w prostych przypadkach.
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