Jednoargumentowe operatory arytmetyczne
Istnieją dwa jednoargumentowe operatory arytmetyczne, plus (+) i minus (-). Dla przypomnienia operatory jednoargumentowe to operatory, które przyjmują tylko jeden operand.
| Operator | Symbol | Formularz | Operacja |
|---|---|---|---|
| Jednoargumentowy plus | + | +x | Wartość x |
| Jednoargumentowy minus | - | -x | Negacja x |
Klasa jednoargumentowym. minus zwraca operand pomnożony przez -1. Innymi słowy, jeśli x = 5, -x wynosi -5.
Klasa operator jednoargumentowy plus zwraca wartość argumentu. Innymi słowy, +5 to 5, a +x to x. Ogólnie rzecz biorąc, nie będziesz musiał używać tego operatora, ponieważ jest on zbędny. Został dodany głównie w celu zapewnienia symetrii z jednoargumentowym. minus operator.
Dla czytelności oba te operatory powinny być umieszczone bezpośrednio przed operandem (np. -x, nie - x).
Nie mylić jednoargumentowym. minus operatora z operator odejmowania binarnego , który wykorzystuje ten sam symbol. Na przykład w wyrażeniu x = 5 - -3; pierwszy minus jest operatorem odejmowania binarnego , a drugi jest operatorem jednoargumentowym. minus operator.
Binarne operatory arytmetyczne
Istnieje 5 binarnych operatorów arytmetycznych operand.
| Operator | Symbol | Formularz | Operacja |
|---|---|---|---|
| Dodawanie | + | x + y | x plus y |
| Odejmowanie | - | x - y | x minus y |
| Mnożenie | * | x * y | x pomnożone przez y |
| Dzielenie | / | x / y | x podzielone przez y |
| Reszta | % | x % y | reszta x podzielona przez y |
Operatory dodawania, odejmowania i mnożenia działają tak samo, jak w prawdziwym życiu, bez żadnych zastrzeżeń.
Dzielenie i reszta wymagają dodatkowego wyjaśnienia. O dzieleniu porozmawiamy poniżej, a resztę w następnej lekcji.
Dzielenie liczb całkowitych i zmiennoprzecinkowych
Najłatwiej jest pomyśleć o operatorze dzielenia jako o dwóch różnych. „tryby”.
Jeśli jeden (lub oba) operandy są wartościami zmiennoprzecinkowymi, operator dzielenia wykonuje dzielenie zmiennoprzecinkowe. Dzielenie zmiennoprzecinkowe zwraca wartość zmiennoprzecinkową, a ułamek jest zachowywany. Na przykład 7.0 / 4 = 1.75, 7 / 4.0 = 1.75, I 7.0 / 4.0 = 1.75 mogą wystąpić błędy zaokrągleń.
Jeśli oba operandy są liczbami całkowitymi, operator dzielenia wykonuje zamiast tego dzielenie na liczbach całkowitych. Dzielenie na liczbach całkowitych porzuca ułamki i zwraca wartość całkowitą. Na przykład 7 / 4 = 1 ponieważ część ułamkowa wyniku jest Podobnie -7 / 4 = -1 ponieważ ułamek został usunięty.
Użycie static_cast<> do dzielenia zmiennoprzecinkowego liczb całkowitych
Powyższe rodzi pytanie - jeśli mamy dwie liczby całkowite i chcemy je podzielić bez utraty ułamka, jak to zrobić?
W lekcji 4.12 -- Wprowadzenie do konwersji typów i static_cast, pokazaliśmy, jak możemy użyć operatora static_cast<> do konwersji znaku na liczbę całkowitą, tak aby był drukowany jako liczba całkowita, a nie jako znak.
Możemy podobnie użyć static_cast<> do konwersji liczby całkowitej na liczbę zmiennoprzecinkową, dzięki czemu możemy potrafi dzielenie zmiennoprzecinkowe zamiast dzielenie przez liczby całkowite Rozważ następujący kod:
#include <iostream>
int main()
{
constexpr int x{ 7 };
constexpr int y{ 4 };
std::cout << "int / int = " << x / y << '\n';
std::cout << "double / int = " << static_cast<double>(x) / y << '\n';
std::cout << "int / double = " << x / static_cast<double>(y) << '\n';
std::cout << "double / double = " << static_cast<double>(x) / static_cast<double>(y) << '\n';
return 0;
}Daje to wynik:
int / int = 1 double / int = 1.75 int / double = 1.75 double / double = 1.75
Powyższe ilustruje, że jeśli którykolwiek z operandów jest liczbą zmiennoprzecinkową, wynikiem będzie dzielenie zmiennoprzecinkowe, a nie całkowite.
Dzielenie przez 0 i 0.0
Dzielenie liczb całkowitych przez dzielnik 0 spowoduje niezdefiniowane zachowanie, ponieważ wyniki są matematycznie niezdefiniowane!
#include <iostream>
int main()
{
constexpr int apples { 12 };
std::cout << "You have " << apples << " apples. Enter how many people to divide them between: ";
int x {};
std::cin >> x;
std::cout << "Each person gets " << apples / x << " whole apples.\n"; // apples and x are int, so this is integer division
return 0;
}Jeśli uruchomisz powyższy program i wprowadź 0, Twój program prawdopodobnie ulegnie awarii. Śmiało, spróbuj, nie zaszkodzi to Twojemu komputerowi.
Wynik dzielenia przez wartość zmiennoprzecinkową 0.0 jest zdefiniowany w implementacji (co oznacza, że zachowanie jest określane przez kompilator/architekturę). W przypadku architektur obsługujących format zmiennoprzecinkowy IEEE754 wynikiem będzie NaN lub Inf. W przypadku innych architektur rezultatem będzie prawdopodobnie niezdefiniowane zachowanie.
Powiązana treść
Omawiamy NaN i Inf w lekcji 4.8 — Liczby zmiennoprzecinkowe.
Możesz zobaczyć, co robi Twój program, uruchamiając następujący program i wprowadzając 0 lub 0.0:
#include <iostream>
int main()
{
constexpr int apples { 12 };
std::cout << "You have " << apples << " apples. Enter how many servings of apples you want: ";
double d {};
std::cin >> d;
std::cout << "Each serving is " << apples / d << " apples.\n"; // d is double, so this is floating point division
return 0;
}Przypisanie arytmetyczne operatory
| Operator | Symbol | Formularz | Operacja |
|---|---|---|---|
| Przypisanie dodawania | += | x += y | Dodaj y do x |
| Odejmowanie | -= | x -= y | Odejmij y z x |
| Przypisanie mnożenia | *= | x *= y | Pomnóż x przez y |
| Przypisanie przez dzielenie | /= | x /= y | Podziel x przez y |
| Przypisanie reszty | %= | x %= y | Umieść resztę x / y w x |
Do tego momentu, gdy trzeba było dodać 4 do zmiennej, prawdopodobnie wykonałeś następujące czynności:
x = x + 4; // add 4 to existing value of xTo działa, ale jest trochę nieporęczne i wymaga dwóch operatorów do wykonania (operator+ i operator=).
Ponieważ pisanie takich instrukcji ponieważ x = x + 4 jest tak powszechne, C++ udostępnia dla wygody pięć arytmetycznych operatorów przypisania. Zamiast pisać x = x + 4 można napisać x += 4. Zamiast, x = x * y można napisać x *= y.
W ten sposób powyższe ma postać:
x += 4; // add 4 to existing value of xOperatory modyfikujące i niemodyfikujące
Operator, który może modyfikować wartość jednego ze swoich operandów, jest nieformalnie nazywany operatorem modyfikującym. W C++ większość operatorów nie modyfikuje - po prostu używają operandów do obliczenia i zwrócenia wartości. Jednakże dwie kategorie wbudowanych operatorów modyfikują lewy operand (oraz zwracają wartość):
- Operatory przypisania, w tym standardowy operator przypisania (
=), arytmetyczne operatory przypisania (+=,-=,*=,/=, I%=) i bitowe operatory przypisania (<<=,>>=,&=,|=i^=). - Operatory inkrementacji i dekrementacji (odpowiednio
++i--). Omówimy je w lekcja 6.4 — Operatory zwiększania/zmniejszania i skutki uboczne.
Wyłączone z tej listy są operatory ==, !=, <=, I >=, ponieważ są to niemodyfikujące operatory relacyjne (porównania) ( = oznacza „jest równe”). Omówiliśmy je w lekcji 6.7 -- Operatory relacyjne i zmiennoprzecinkowe porównania.
Dla zaawansowanych czytelników
Przeciążone operatory można przedefiniować tak, aby zachowywały się inaczej niż operatory wbudowane, co może obejmować modyfikację lewego operandu, nawet jeśli wersja wbudowana tego nie robi (lub odwrotnie). Na przykład przeciążona wersja operator<< używana do wyjścia modyfikuje lewy operand (obiekt strumienia wyjściowego).

