Výrazy

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)

Operátory podle typu relace

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 :

Unární operátory

Jak již bylo uvedeno, tyto operátory potřebují jenom jeden operand. V Pascalu je unární operátorů pouze několik :

  1. not - negace (ať již bitová či logická), uvádí se před operandem
  2. @ - adresní operátor (vrací adresu na proměnnou), uvádí se před operandem
  3. ^ - adresní operátor (vrací proměnnou, na kterou ukazuje pointer), jako jediný se uvádí za operandem
  4. - - unární minus (mění znaménko), píše se před operand

Binární operátory

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 :

  1. * násobení (průnik množin), co dodat
  2. / dělení (pozor, výsledkem je typ Real)
  3. div celočíselné dělení
  4. mod zbytek po celočíselném dělení
  5. and a současně (ať již logicky či jako bitové násobení)
  6. shl bitový posun doleva
  7. shr bitový posun doprava
  8. + sčítání (sjednocení množin, spojení řetězců)
  9. - odčítání (rozdíl množin)
  10. or nebo (logicky i bitově)
  11. xor buď anebo (logicky i bitově)
  12. = porovnání (je shodné?), výsledek je typu Boolean
  13. <> porovnání (je rozdílné), výsledek zase Boolean
  14. <= porovnání (je menší nebo rovno, je podmnožinou?), výsledek zase Boolean
  15. >= porovnání (je větší nebo rovno, je nadmnožinou?), výsledek zase Boolean
  16. < porovnání (je menší?), výsledek - Boolean
  17. > porovnání (je větší?), výsledek - Boolean
  18. in porovnání (je x prvkem množiny Y?), výsledek - Boolean

Ternární operátory

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átory

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

Operátory podle funkce

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.

Aritmetické operátory

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

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.

Logické operátory

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

Řetězcové operátory

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 !)

Množinové operátory

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

Relační operátory

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.

Adresní operátory

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

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.

Priorita operátorů

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.