Rozdział 4. Wyrażenia i instrukcje, Informatyka, Technik informatyki, Programowanie, C++

[ Pobierz całość w formacie PDF ]
Rozdział 4.
Wyrażenia i instrukcje
Program stanowi zestaw kolejno wykonywanych instrukcji. Jakość działania programu zależy od
możliwości wykonywania określonego zestawu instrukcji w danych warunkach.
Z tego rozdziału dowiesz się:
• czym są instrukcje,
• czym są bloki,
• czym są wyrażenia,
• jak, w zależności od warunków, kierować wykonaniem programu,
• czym jest prawda i jak działać na jej podstawie.
Instrukcje
W C++ instrukcje kontrolują kolejność działania programu, obliczają wyrażenia lub nie robią nic
(instrukcja pusta). Wszystkie instrukcje C++ kończą się średnikiem (nawet instrukcja pusta, która
składa się wyłącznie ze średnika). Jedną z najczęściej występujących instrukcji jest instrukcja
przypisania:
x = a + b;
W przeciwieństwie do znaczenia, jakie ma w algebrze, ta instrukcja nie oznacza tutaj, że
x
równa
się
a+b
. Należy ją traktować jako „przypisz wartość sumy
a
i
b
do
x
” lub „przypisz
a+b
do
x
” lub
„niech
x
równa się
a+b
.” Choć ta instrukcja wykonuje dwie czynności, nadal jest pojedynczą
instrukcją (stąd tylko jeden średnik). Operator przypisania przypisuje to, co znajduje się po prawej
stronie znaku równości elementowi znajdującemu się po lewej stronie.
Białe spacje
Białe spacje (tabulatory, spacje i znaki nowej linii) są w instrukcjach ignorowane. Omawiana
poprzednio instrukcja przypisania może zostać zapisana jako:
x=a+b;
lub jako:
x =a
+ b ;
Choć ostatni zapis jest poprawny, jest równocześnie niemądry. Białe spacje mogą być używane w
celu poprawienia czytelności programu lub stworzenia okropnego, niemożliwego do
rozszyfrowania kodu. C++ daje do wyboru wiele możliwości, ale ich rozważne użycie zależy od
ciebie.
Znaki białych spacji nie są widoczne. Gdy zostaną wydrukowane, na papierze będą widoczne jako
odstępy.
Bloki i instrukcje złożone
Wszędzie tam, gdzie może znaleźć się instrukcja pojedyncza, może znaleźć się także instrukcja
złożona, zwana także blokiem. Blok rozpoczyna się od otwierającego nawiasu klamrowego (
{
) i
kończy nawiasem zamykającym (
}
). Choć każda instrukcja w bloku musi kończyć się średnikiem,
sam blok nie wymaga jego zastosowania (jak pokazano w poniższym przykładzie):
{
temp = a;
a = b;
b = temp;
}
Ten blok kodu działa jak pojedyncza instrukcja i zamienia wartości w zmiennych
a
i
b
.
TAK
Jeśli użyłeś otwierającego nawiasu klamrowego, pamiętaj także o nawiasie zamykającym.
Kończ instrukcje średnikiem.
Używaj rozważnie białych spacji, tak aby kod był czytelny.
Wyrażenia
Wszystko, co staje się wartością, w C++ jest uważane za wyrażenie. Mówi się, że wyrażenie
zwraca wartość. Skoro instrukcja
3+2;
zwraca wartość
5
, więc jest wyrażeniem. Wszystkie
wyrażenia są jednocześnie instrukcjami.
Możesz zdziwić się, ile miejsc w kodzie kwalifikuje się jako wyrażenia. Oto trzy przykłady:
3.2 // zwraca wartość 3.2
PI // stała typu float zwracająca wartość 3.14
SecondsPerMinute // stała typu int zwracająca 60
Gdy założymy, że
PI
jest stałą, którą zainicjalizowałem wartością 3.14 i że
SecondsPerMinute
(sekund na minutę) jest stałą wynoszącą 60, wtedy wszystkie te trzy instrukcje są wyrażeniami.
Nieco bardziej skomplikowane wyrażenie
x = a + b;
nie tylko dodaje do siebie
a
oraz
b
, a wynik umieszcza w
x
, ale także zwraca wartość tego
przypisania (nową wartość
x
). Zatem instrukcja przypisania także jest wyrażeniem. Ponieważ jest
wyrażeniem, może wystąpić po prawej stronie operatora przypisania:
y = x = a + b;
Ta linia jest przetwarzana w następującym porządku:
Dodaj
a
do
b
.
Przypisz wynik wyrażenia
a + b
do
x
.
Przypisz rezultat wyrażenia przypisania,
x = a + b
, do
y
.
Jeśli
a
,
b
,
x
oraz
y
byłyby zmiennymi całkowitymi, zaś
a
miałoby wartość 2, a
b
miałoby wartość
5, wtedy zarówno zmiennej
x
, jak i
y
zostałaby przypisana wartość 7. Ilustruje to listing 4.1.
Listing 4.1. Obliczanie wyrażeń złożonych
0: #include <iostream>
1: int main()
2: {
3: using std::cout;
4: using std::endl;
5:
6: int a=0, b=0, x=0, y=35;
7: cout << "a: " << a << " b: " << b;
8: cout << " x: " << x << " y: " << y << endl;
9: a = 9;
10: b = 7;
11: y = x = a+b;
12: cout << "a: " << a << " b: " << b;
13: cout << " x: " << x << " y: " << y << endl;
14: return 0;
15: }
Wynik
a: 0 b: 0 x: 0 y: 35
a: 0 b: 7 x: 16 y: 16
Analiza
W linii 6. deklarowane i inicjalizowane są cztery zmienne. Ich wartości są wypisywane w liniach
7. i 8. W linii 9. zmiennej
a
jest przypisywana wartość
9
. W linii 10., zmiennej
b
jest
przypisywana wartość 7. W linii 11. zmienne
a
i
b
są sumowane, zaś wynik sumowania jest
przypisywany zmiennej
x
. To wyrażenie (
x = a+b
) powoduje obliczenie sumy
a
oraz
b
i
przypisanie jej do zmiennej
x
, wartość tego przypisania jest następnie przypisywana zmiennej
y
.
Operatory
Operator jest symbolem, który powoduje, że kompilator rozpoczyna działanie. Operatory działają
na operandach, zaś wszystkie operandy w C++ są wyrażeniami. W C++ istnieje kilka kategorii
operatorów. Dwie z tych kategorii to:
• operatory przypisania,
• operatory matematyczne.
Operator przypisania
Operator przypisania (
=
) powoduje, że operand znajdujący się po lewej stronie operatora
przypisania zmienia wartość na wartość operandu znajdującego się po prawej stronie operatora.
Wyrażenie:
x = a + b;
przypisuje operandowi
x
wynik dodawania wartości
a
i
b
.
Operand, który może wystąpić po lewej stronie operatora przypisania jest nazywany l-wartością (
l-
value
). Natomiast ten, który może znaleźć się po prawej stronie, jest nazywany (jak można się
domyślić), r-wartością (
r-value
).
Stałe są r-wartościami. Nie mogą być l-wartościami. Zatem możesz napisać:
x = 35; // OK
lecz nie możesz napisać:
35 = x; // błąd, 35 nie może być l-wartością!
L-wartość jest operandem, który może znaleźć się po lewej stronie wyrażenia. R-wartość jest
operandem, który może występować po prawej stronie wyrażenia. Zwróć uwagę, że wszystkie l-
wartości mogą być r-wartościami, ale nie wszystkie r-wartości mogą być l-wartościami.
Przykładem r-wartości, która nie jest l-wartością, może być literał. Zatem możesz napisać
x = 5;
,
lecz nie możesz napisać
5 = x;
(
x
może być l- lub r-wartością, lecz 5 może być tylko r-
wartością).
Operatory matematyczne
Piątka operatorów matematycznych to: dodawanie (
+
), odejmowanie (

), mnożenie (
*
), dzielenie
(
/
) oraz reszta z dzielenia (
%
).
Dodawanie i odejmowanie działają rutynowo, choć odejmowanie liczb całkowitych bez znaku
może prowadzić do zadziwiających rezultatów gdy wynik będzie ujemny. Z czymś takim
spotkałeś się w poprzednim rozdziale, kiedy opisywaliśmy przepełnienie (przewinięcie wartości).
Listing 4.2 pokazuje, co się stanie gdy odejmiesz dużą liczbę całkowitą bez znaku od małej liczby
całkowitej bez znaku.
Listing 4.2. Przykład odejmowania i przepełnienia wartości całkowitej
0: // Listing 4.2 - Demonstracja odejmowania
1: // i przepełnienia wartości całkowitej.
2: #include <iostream>
3:
4: int main()
5: {
6: using std::cout;
7: using std::endl;
8:
9: unsigned int difference;
10: unsigned int bigNumber = 100;
11: unsigned int smallNumber = 50;
12: difference = bigNumber - smallNumber;
13: cout << "Roznica to: " << difference;
14: difference = smallNumber - bigNumber;
15: cout << "\nTeraz roznica to: " << difference <<endl;
16: return 0;
17: }
Wynik
Roznica to: 50
Teraz roznica to: 4294967246
Analiza
Operator odejmowania jest wywoływany w linii 12., zaś wynik jest wypisywany w linii 13. (taki,
jakiego mogliśmy oczekiwać). Operator odejmowania jest ponownie wywoływany w linii 14.,
jednak tym razem od małej liczby całkowitej bez znaku jest odejmowana duża liczba całkowita
bez znaku. Wynik powinien być ujemny, ale ponieważ wartości są obliczane (i wypisywane) jako
liczby całkowite bez znaku, efektem tej operacji jest przepełnienie, tak jak opisywaliśmy w
[ Pobierz całość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • frania1320.xlx.pl
  • Tematy