Operátory slouží k provedení nějaké operace s danou hodnotou. Hodnoty a operátory zapsané za sebou podle určitých pravidel tvoří výraz. Každý výraz nabývá určité hodnoty (Např. 2+5 nabývá hodnoty 7)
Za tímto rozlišením se neskrývá nic složitého. Operátor dává do určitého vztahu několik hodnot (operandů). Podle počtu hodnot, které operátor vyžaduje rozlišujeme operátory unární (ty k sobě potřebují jednu jedinou hodnotu), operátory binární (vyžadují dvě hodnoty), operátory ternární (tři hodnoty),...
Podívejme se nyní, jak jsou na tom jednotlivé operátory v Pascalu :
Jak již bylo uvedeno, tyto operátory potřebují jenom jeden operand. V Pascalu je unární operátorů pouze několik :
Tyto operátory k sobě potřebují dva operandy, obvykle se používá algebraická forma zápisu ( Operand1 Operátor Operand2 - např. c + 2); Pascal jich má celou řadu :
Ternární operátor je takový operátor, který potřebuje tři operandy. Pascal takovýto operátor nemá (na rozdíl od C, C++ a podobných jazyků).
N-ární operátor je operátor, který potřebuje n operandů. Protože funkce vytváří z daných hodnot(tj. operandů) výsledek, jedná se o jednoduchý případ n-árního operátoru. Uživatelem definovaná f-ce může mít velmi hodně operandů (ale pořád dává jen jeden jediný výsledek!!!).
Pochopitelně je mnohem účelnější seřadit operátory podle toho, co a na jakém typu dat dělají a jakého typu dat je výsledek.
Operátory binární (použití: Hodnota1 operátor Hodnota2. Např. a div b)
Operátor | Operace | Typ operandů | Typ výsledku |
+ | sčítání | celočíselný / reálný | celočíselný / reálný |
- | odčítání | celočíselný / reálný | celočíselný / reálný |
* | násobení | celočíselný / reálný | celočíselný / reálný |
/ | dělení | celočíselný / reálný | reálný / reálný |
div | celočíselné dělení | celočíselný | celočíselný |
mod | zbytek po celočíselném dělení | celočíselný | celočíselný |
Unární operátory (použití : Operátor Hodnota. Např. -12)
Operátor | Operace | Typ operandu | Typ výsledku |
- | unární minus | číselný | číselný |
+ | unární plus | číselný | číselný |
Bitové operátory lze použít pouze na proměnné celočíselného typu. Tyto operátory jsou prováděny na každém bitu dané celočíselné proměnné. U operací posuvu se přebytečné bity ztrácejí. Jediným unárním operátorem je zde not.
Operátor | Operace | Typ operandů | Typ výsledku |
not | bitová negace | celočíselný | celočíselný |
and | bitový logický součin | celočíselný | celočíselný |
or | bitový logický součet | celočíselný | celočíselný |
xor | bitový exkluzivní součet | celočíselný | celočíselný |
shl | bitový posun doleva | celočíselný | celočíselný |
shr | bitový posun doprava | celočíselný | celočíselný |
Na konkrétního využití bitových operátorů se podíváme až v algoritmech.
Operandy těchto operátorů jsou logického typu (Boolean), stejně tak jako výsledek. Jediným unárním operátorem je not.
Operátor | Operace | Typ operandů | Typ výsledku |
not | negace | Boolean | Boolean |
and | logický součin (a současně) | Boolean | Boolean |
or | logický součet (nebo) | Boolean | Boolean |
xor | exkluzivní součet (buď anebo) | Boolean | Boolean |
Pomocí těchto operátorů lze tedy velice snadno vytvořit složitou podmínku nějakého cyklu či podmíněného příkazu (podmínka je totiž výraz typu Boolean).
Funkce zajišťují Vše potřebné pro práci s řetězci. Existuje jediný řetězcový operátor (tzv. operátor spojení) - ten umožní spojit dva řetězce (jedná se o binární operátor a označuje se +) použití je jednoduché : 'Nic' + 'Alfa' + Beta; (Toto sčítání není komutativní, zkuste si prohodit Nic a Alfa !)
I na množinách lze provádět operace.
Operátor | Operace | Typ operandů | Typ výsledku |
+ | sjednocení | kompatibilní typy množin | množina |
* | průnik | kompatibilní typy množin | množina |
- | rozdíl | kompatibilní typy množin | množina |
= | ≡ (jsou množiny shodné?) | kompatibilní typy množin | Boolean |
<> | ≠ (jsou množiny rozdílné?) | kompatibilní typy množin | Boolean |
<= | je A podmnožinou B (vyzkoušejte si to) | kompatibilní typy množin | Boolean |
>= | je A nadmnožinou B | kompatibilní typy množin | Boolean |
in | příslušnosti | prvek množiny, množina | Boolean |
Tyto operátory porovnávají dva zadané hodnoty, pomocí nich se vytvářejí jednoduché podmínky. Výsledným typem je vždy typ Boolean. Srovnávané proměnné musí být kompatibilní.
Operátor | Operace |
= | je rovno? |
<> | je různé? |
<= | je menší nebo rovno, je podmnožinou? |
>= | je větší nebo rovno, je nadmnožinou? |
< | je menší? |
> | je větší? |
in | a in b ≡ je a prvkem množiny b? |
Je povoleno srovnávat pouze jednoduché typy a řetězce (ty se porovnávají podle ASCII - tedy podle abecedy, kde diakritika je až po z...). Při srovnávání ukazatelů je povoleno používat pouze <> a =. Dva ukazatele jsou (díky normalizaci) stejné, ukazují-li na stejný objekt.
Tyto operátory slouží k práci s ukazateli. Jsou unární. Operátor ^ se píše až za danou proměnnou (ukazatel).
Operátor | Operace | Typ operandů | Typ výsledku |
@ | vrátí ukazatel (adresu) | libovolný | ukazatel |
@@ | vrátí ukazatel | procedurální proměnná | ukazatel |
^ | vrátí proměnnou | ukazatel | libovolný |
Při použití na procedurální proměnnou @ konvertuje proměnnou na ukazatel (procedurální proměnná je ukazatel na proceduru), @@ vrátí ukazatel na danou proměnnou (a ne na jí přiřazenou proceduru)
Volání funkce je operátorem (všechny operátory se uvádí v závorce za operátorem, oddělené čárkou: SectiTriCisla(1,2,7); ). Existuje celé množství standardních funkcí. V případě potřeby si lze definovat další. Volání funkce má vždy tu nejvyšší prioritu.
Při vyhodnocování výrazů mají jednotlivé operátory určitou důležitost, určitě pořadí, v kterém se vyhodnotí (nejprve se násobí a teprve pak sčítá). Toto pořadí je určené tzv. prioritou operátorů. Mají-li dva operátory stejnou prioritu, postupuje se pří jejich vyhodnocování zleva doprava.
Tabulka priority operátorů:
Operátory | Priorita | Kategorie |
---|---|---|
volání funkce | nejvyšší | uživatelem definované |
@ not | vysoká | unární |
* / div mod and shl shr | střední | multiplikativní |
+ - or xor | nízká | aditivní |
= <> <= >= < > in | nejnižší | relační |
Při tvorbě složitějších výrazů si musíme dávat pozor na prioritu operátorů a
v případě potřeby závorkovat, závorkovat a závorkovat.
x > 7 or x <-7 se vyhodnotí takto: (x
> (7 or x)) < -7,
což je syntaktická chyba (upozorní nás na ni již překladač). V
tomto případě totiž srovnáváme nekompatibilní typy: (x>(7 or
x)) je typu Boolean, kdežto -7 je typu celočíselného.
Horší by to bylo, kdybychom porovnávali proměnné typu Boolean (srovnání by bylo typově správně, ale výsledek by byl dost divoký). Na tuto chybu by nás překladač neupozornil. Závorkujte tedy, většinou je to nutné.
DCV: Vyzkoušejte si uvedený příklad, ve kterém budete porovnávat booleovské hodnoty (false < true). Zkonstruujte ho tak, aby i chybný zápis dával správné výsledky, poté udělejte jiný příklad, kde se výsledky budou lišit.