6.2 — Operatory arytmetyczne

Jednoargumentowe operatory arytmetyczne

Istnieją dwa jednoargumentowe operatory arytmetyczne, plus (+) i minus (-). Dla przypomnienia operatory jednoargumentowe to operatory, które przyjmują tylko jeden operand.

OperatorSymbolFormularzOperacja
Jednoargumentowy plus++xWartość x
Jednoargumentowy minus--xNegacja 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.

OperatorSymbolFormularzOperacja
Dodawanie+x + yx plus y
Odejmowanie-x - yx minus y
Mnożenie*x * yx pomnożone przez y
Dzielenie/x / yx 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

OperatorSymbolFormularzOperacja
Przypisanie dodawania+=x += yDodaj y do x
Odejmowanie-=x -= yOdejmij y z x
Przypisanie mnożenia*=x *= yPomnóż x przez y
Przypisanie przez dzielenie/=x /= yPodziel x przez y
Przypisanie reszty%=x %= yUmieść 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 x

To 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 x

Operatory 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).

guest
Twój adres e-mail nie zostanie wyświetlony
Znalazłeś błąd? Zostaw komentarz powyżej!
Komentarze związane z poprawkami zostaną usunięte po przetworzeniu, aby pomóc zmniejszyć bałagan. Dziękujemy za pomoc w ulepszaniu witryny dla wszystkich!
Awatary z https://gravatar.com/ są połączone z podanym adresem e-mail.
Powiadamiaj mnie o odpowiedziach:  
393 Komentarze
Najnowsze
Najstarsze Najczęściej głosowane
Wbudowane opinie
Wyświetl wszystkie komentarze