Operatory
Operatory są symbolami języka służącymi — mówiąc najogólniej — do manipulowania danymi. Istnieją operatory arytmetyczne — dodawania, odejmowania, mnożenia i dzielenia wartości liczbowych, operator przypisania, wyboru elementu z tablicy itp.
Operator przypisania
Operator przypisania służy do przypisania zmiennej wartości; jest to bodaj najprostszy, lecz jednocześnie jeden z najważniejszych operatorów języka. Oto jeden z przykładów jego zastosowania:
Number1 := 5;
Powyższa instrukcja przypisuje zmiennej Number1 wartość 5.
Operatory porównania
Operatory porównania w Delphi i w Visual Basicu są niemalże identyczne. Służą do stwierdzenia równości lub nierówności dwóch wartości albo ich porównania pod względem relacji mniejszości. W tabeli 2.2 przedstawione zostały łącznie operatory porównania i operatory logiczne, w tym miejscu chcemy jedynie zwrócić uwagę na istotną różnicę między operatorem porównania (= w Delphi, == w C i Javie) a operatorem przypisania (:= w Delphi, = w C i Javie).
Operator badający nierówność dwóch wielkości, w języku C mający sugestywną postać !=, w Pascalu ma postać <>, na przykład:
if x <> y
Then
Cokolwiek
Operatory logiczne
Operatory logiczne realizują (w ograniczonym zakresie) operacje wynikające z algebry Boole'a (stąd często nazywane bywają operatorami boolowskimi — ang. Boolean operators). Ich typowym zastosowaniem jest jednoczesne testowanie kilku warunków, na przykład:
if (warunek1) and (warunek2)
Then
Cokolwiek
While (warunek1) or (warunek2) do
Cokolwiek
Operatory logiczne obecne są w każdym języku programowania, chociaż ich postać jest różnorodna. Tabela 2.2 przedstawia operatory porównania oraz operatory logiczne w Pascalu, C, Javie i Visual Basicu.
Tabela 2.2. Operatory przypisania, porównania i operatory logiczne
Operator |
Pascal |
Java i C |
Visual Basic |
Przypisania |
:= |
= |
= |
Równości |
= |
== |
Is (dla obiektów) = (dla innych typów) |
Nierówności |
<> |
!= |
<> |
Mniejszości |
< |
< |
< |
Większości |
> |
> |
> |
Niewiększości |
<= |
<= |
<= |
Niemniejszości |
>= |
>= |
>= |
Logiczne „i” |
and |
&& |
And |
Logiczne „lub” |
or |
|| |
Or |
Zaprzeczenie |
not |
! |
Not |
Operatory arytmetyczne
Tabela 2.3 prezentuje operatory arytmetyczne Pascala, C, Javy i Visual Basica.
Tabela 2.3. Operatory arytmetyczne
Operator |
Pascal |
Java i C |
Visual Basic |
Dodawania |
+ |
+ |
+ |
Odejmowania |
- |
- |
- |
Mnożenia |
* |
* |
* |
Dzielenia rzeczywistego |
/ |
/ |
/ |
Dzielenia całkowitego |
div |
/ |
\ |
Reszty z dzielenia (modulo) |
mod |
% |
Mod |
Potęgowania |
brak |
brak |
^ |
Jak wynika z tabeli, Pascal i Visual Basic rozróżniają dzielenie liczb całkowitych (wynik jest liczbą całkowitą) od dzielenia liczb rzeczywistych (wynik jest liczbą rzeczywistą); Java i C nie czynią takiego rozróżnienia.
Ostrzeżenie
Wykonując dzielenie, zawsze używaj operatorów stosownych do operandów i oczekiwanego wyniku. Kompilator Object Pascala nie zezwoli na dzielenie całkowite operandów, z których co najmniej jeden nie jest liczbą całkowitą. Równie powszechnym błędem jest próba przypisania zmiennej całkowitej wyniku dzielenia rzeczywistego (operator /), co ilustruje poniższy przykład:
Var
i : integer;
r : real;
begin
i := 4/3 // tu wystąpi błąd kompilacji
r := 3.4 div 2.3; // ta linia również jest błędna
i := Trunc(4/3); // ta linia jest poprawna
r := 3.4 / 2.3; // ta linia również jest poprawna
end;
Jako ciekawostkę odnotować należy fakt, iż wiele języków nie wykonuje dzielenia całkowitego i w związku z tym posiada jeden, uniwersalny operator dzielenia. Dzielenie dwóch liczb całkowitych przebiega więc następująco: konwersja na typ zmiennoprzecinkowy, wykonanie dzielenia zmiennoprzecinkowego oraz konwersja wyniku (po zaokrągleniu lub obcięciu — różnie bywa) na typ całkowity. Jest to działanie kosztowne oraz nieefektywne w sytuacji, gdy procesor posiada instrukcje dzielenia całkowitego (posiadają je wszystkie procesory 80×86).
Operatory zwiększania i zmniejszania
Realizują one zoptymalizowaną operację zwiększania (increment) lub zmniejszania (decrement) zmiennej typu porządkowego. Operatory te występują w dwóch odmianach. Pierwsza z nich powoduje zmianę wartości zmiennej o 1 (w górę lub w dół):
Inc(zmienna);
Dec(zmienna);
i jest przez kompilator przekładana na pojedynczą instrukcję INC lub DEC kodu maszynowego.
Operatory w postaci dwuargumentowej
Inc(zmienna, dystans);
Dec(zmienna, dystans);
powodują zmniejszenie albo zwiększenie zmiennej o wartość zadaną jawnie w postaci drugiego argumentu; operacja jest realizowana przez kompilator w postaci rozkazu ADD albo SUB.
Notatka
Kompilator Delphi w wersji 2 i następnych jest na tyle „inteligentny”, że sam rozpoznaje operację zmniejszania/zwiększania zmiennej za pomocą zwykłej operacji dodawania lub odejmowania, tak więc przekład instrukcji x := x + 1 nie różni się od przekładu instrukcji Inc(x), dlatego główną korzyścią wynikającą z użycia omawianych operatorów jest raczej wygoda programisty.
Zestawienie operatorów zwiększania i zmniejszania dla omawianych języków przedstawia tabela 2.5.
Tabela 2.5. Operatory zwiększania i zmniejszania
Operator |
Pascal |
Java i C |
Visual Basic |
Zwiększania |
Inc() |
++ |
nie istnieje |
Zmniejszania |
Dec() |
-- |
nie istnieje |
Operatory „wykonaj i przypisz”
Object Pascal, w przeciwieństwie do C i Javy, nie posiada operatorów oznaczających (mówiąc ogólnie) wykonanie na zmiennej pewnej operacji i stanowiących pewne uogólnienie operatorów inc() i dec() — nowa wartość zmiennej musi być zapisana explicite po prawej stronie operatora przypisania, tak więc zupełnie naturalna w C instrukcja
x += 5;
w Pascalu musi być zapisana jako
x := x + 5;