Wyrażenia i operatory

Z tej lekcji dowiesz się, jak skłonić komputer do wykonania za Ciebie różnych obliczeń matematycznych i zamienić go w podręczny kalkulator ;-) Do takich rzeczy w języku C++ służą wyrażenia i operatory.

Wyrażenia? A co to takiego?

Wyrażenie jest to takie coś, co nakazuje komputerowi wykonanie obliczeń. Wyrażenie [jako całość] ma pewną wartość, która jest wynikiem tych obliczeń. Aby poznać wartość wyrażenia, komputer musi go obliczyć. Podczas wykonywania takich obliczeń mogą dodatkowo zajść różne skutki uboczne, ale tym zajmiemy się później ;-) Wartość wyrażenia, jak wszystko w języku C++, ma oczywiście swój typ.

Wyrażenia proste

Najprostszymi wyrażeniami mogą być po prostu wartości stałe podane dosłownie, np. 2, 1.234, 'c', "abcdef", false itp. Wtedy akurat sprawa jest prosta i nie trzeba niczego obliczać, bo wartość jest już gotowa i stoi jak byk w programie ;-)

Wyrażeniami prostymi mogą być też nazwy [czyli np. cout, main, sin itp.], dzięki czemu w wyrażeniach możesz się odwoływać do obiektów, funkcji i innych rzeczy mających nazwy ;-) Jeśli nazwa odnosi się do obiektu, wartość wyrażenia jest wyciągana z tego obiektu. Jeśli nazwa odnosi się do funkcji, wartością wyrażenia jest adres tej funkcji w pamięci.

Z wyrażeń prostych możesz składać bardziej rozbudowane, posługując się operatorami.

Operatory

Operatory służą do łączenia ze sobą składników wyrażeń i wykonywania na nich różnych działań [operowania na nich ;-)]. Większość z nich na pewno będzie Ci już znana, bo używa się ich na matematyce już w szkole podstawowej ;-D Oprócz nich język C++ posiada także parę innych operatorów, które postaram się omówić w tej lekcji. Niektóre operatory będę mógł omówić dopiero w przyszłych lekcjach, czyli wtedy gdy będą Ci już potrzebne ;-)

Operatory arytmetyczne

Na pewno znasz je z lekcji matematyki ;-) jednak mimo to czytaj uważnie, bo w C++ mają one swoje szczególne właściwości, o których warto wiedzieć ;-J

Operator dodawania

Zaczniemy od operatora + [plus]. Dodaje on dwie wartości, które znajdują się po jego lewej i prawej stronie. Wartością całego tego wyrażenia jest wynik dodawania. Jeśli wartość znajduje się tylko po prawej stronie znaku +, to traktowany jest on po prostu jako dodatni znak tej wartości. Wyrażenia z operatorem + można łączyć kaskadowo i wtedy jest on łączny lewostronie [czyli obliczenia są wykonywane w kolejności od lewej do prawej]. Przykłady:

2+2     //Dodanie dwóch liczb. Wynikiem jest wartość 4.
+7      //Wynikiem jest wartość 7.
3+7+5   //To zamo, co (3+7)+5. Wynikiem jest wartość 15.

Operator odejmowania

Podobnie działa operator - [minus]. Służy on oczywiście do odejmowania dwóch wartości [prawej od lewej]. Jeśli wartość znajduje się tylko z jego prawej strony, to jest on traktowany jako ujemny znak tej wartości. Jego też można łączyć kaskadowo. Przykłady:

5-3     //Odjęcie dwóch liczb. Wynikiem jest 2.
-8      //Wynikiem jest wartość -8 [czyli 8 z przeciwnym znakiem].
7-2-3   //To samo, co (7-2)-3. Wynik to liczba 2.

Operator mnożenia

Do wykonywania mnożenia służy operator * [gwiazdka]. Jest on wykonywany zawsze przed dodawaniem, tak jak w matematyce [ma wyższy priorytet, wytłumaczę to za chwilę]. W innych przypadkach jest łączny lewostronnie. Kilka przykładów użycia:

3*3       //Pomnożenie dwóch liczb. Wynik jest 9.
2*3*4     //To samo, co (2*3)*4. Wynikiem będzie 24.
2+2*2     //To samo, co 2+(2*2). Wynikiem będzie 6, a nie 8 ;-)

Pamiętaj zawsze, by uważać na kolejność działań ;-) Jeśli masz wątpliwości, zawsze możesz stosować nawiasy. Możesz je stosować także do zmiany kolejności obliczeń.

Operator dzielenia

Dzielenie wykonuje się operatorem / [slash]. Przykłady użycia operatora dzielenia:

8/4     //Dzielenie dwóch liczb. Wynik jest 2.
8/2/2   //To samo, co (8/2)/2. Wynik to liczba 2.

Korzystając z operatora dzielenia musisz uważać na kilka rzeczy. Jego działanie może być różne zależnie od tego, jakiego typu wartości ma po obu stronach. Jeśli z obu stron ma wartości całkowite, to dokona dzielenia całkowitego i wynikiem też będzie liczba całkowita.

Odpowiada to działaniu słowa kluczowego div w języku Pascal.

Przykładowo jeśli napiszesz takie wyrażenie:

3 / 2

Kompilator widzi, że zarówno 3, jak i 2, są wartościami typu całkowitego. Wykona więc dzielenie całkowite i zamiast spodziewanego 1.5 wynik będzie 1, bo dwójka mieści się w trójce w całości tylko raz. Nie zawsze jest to pożądane działanie.

Jeśli chcesz dokonać dzielenia, które w wyniku da liczbę rzeczywistą, to przynajmniej jeden ze składników dzielenia musi mieć typ rzeczywisty, bo wtedy kompilator wykona dzielenie rzeczywiste. Możesz to osiągnąć, zapisując to wyrażenie w taki sposób:

3.0 / 2.0

Kompilator zobaczy wtedy, że oba składniki są typu rzeczywistego i użyje dzielenia rzeczywistego. Wtedy wynik będzie także liczbą rzeczywistą, czyli będzie już porawnie: 1.5.

Musisz też uważać, żeby nigdy nie dzielić przez 0. Gdy procesor wykonuje twój program i każesz mu podzielić coś przez zero, to głupieje i odmawia współpracy, powodując sprzętowy błąd. System operacyjny reaguje wtedy gwałtownym ubiciem Twojego programu :-P

Operator reszty z dzielenia

Dodatkowo w C++jest jeszcze operator % [procent], czyli operator modulo, który oblicza resztę z dzielenia dwóch liczb całkowitych. Przykład:

11%4    //Reszta z dzielenia 11 przez 4. Wynikiem jest 3.

Ten operator ma pewną ciekawą właściwość. Cokolwiek mu podasz jako pierwszy składnik możesz mieć pewność, że wynik nigdy nie będzie większy niż drugi składnik ;-) Np. jeśli drugim składnikiem jest 7, to wynik będzie zawsze w przedziale od 0 do 6.

Może on też służyć do sprawdzania podzielności przez jakąś liczbę, bo jeśli liczba po lewej będzie podzielna przez liczbę po prawej, to wynikiem tego operatora będzie 0, bo nie zostaje żadna reszta z dzielenia ;-) Jeśli po prawej stronie postawisz liczbę 2, to możesz w ten sposób sprawdzać czy liczba jest parzysta :-) [jest to często zadawane przez profesorów zadanie ;-J i "temat-bumerang" na grupie dyskusyjnej pl.comp.lang.c :-P].

Operator przypisania

Bla bla bla...

Przypisanie złożone

Chcąc dodać jakąś wartość do obiektu możesz zapisać to tak, jak w innych językach programowania:

Liczba = Liczba + 10

Jednak gdy przyjdzie ci napisać coś takiego dla o wiele dłuższej nazwy obiektu, będziesz kląć jak szewc :-P Dam ci mały przykład, który dobrze obrazuje ten problem:

JakasBardzoDlugaNazwaObiektu = JakasBardzoDlugaNazwaObiektu + 10

Jak widzisz, musisz napisać tą jakże długą nazwę obiektu dwa razy! Oznacza to także, że aby obliczyć takie wyrażenie, program musi sięgnąć do pamięci dwa razy po ten obiekt - raz, by odczytać jego wartość potrzebną do obliczenia sumy z liczbą 10, a później drugi raz, by zapisać w nim wynik. Na szczęście język C++ został "stuningowany" pod takie sytuacje i na ten cel ma dodatkowe operatory przypisania:

JakasBardzoDlugaNazwaObiektu += 10

Prawda że lepiej? :-> To pozwala nie tylko uprościć zapis i uniknąć pisania długiej nazwy obiektu dwa razy, ale też sprawia, że takie obliczenia są szybsze w języku C++ ;-) Tym razem wystarczy bowiem tylko jedno odwołanie do obiektu - program od razu powiększa wartość zapamiętaną w obiekcie o 10 :-) Tej sztuczki możesz używać nie tylko dla dodawania, ale wszystkich innych operatorów arytmetycznych i bitowych ;-) Przykłady:

a -= 5   // Odpowiada działaniu a = a - 5, czyli odjęciu 5 od a.
b *= 2   // Odpowiada b = b * 2, czyli podwojeniu b.
c /= 2   // Oznacza działanie c = c / 2, czyli zmniejszeniu c o połowę.
d <<= 4  // To samo, co d = d << 4, czyli przesunięcie bitów d w lewo o 4.

Instrukcje wyrażeniowe

Wyrażenia nie mogą jednak występować "luzem". Mogą za to być np. częścią instrukcji. Takie instrukcje, składające się z samego wyrażenia, to tak zwane instrukcje wyrażeniowe. Wyglądają one np. tak:


Subskrybcja

Buttony
Pomagał GIMP Powered by NAVI GameCreator GameCreator GameCreator