Operátor (programování)
Operátor je v programovacích jazycích symbol používaný ve výrazech, který předepisuje provedení nějaké (nejčastěji matematické nebo logické) operace s hodnotami (operandy) zapsanými ve svém okolí. Výsledkem použití operátoru je podobně jako u funkce hodnota; způsob použití operátorů se však zpravidla od funkcí liší syntakticky i sémanticky.
K nejrozšířenějším operátorům dostupným ve většině programovacích jazyků patří binární operátory +
, -
, *
, /
pro sčítání, odčítání, násobení a dělení čísel.
Jména operátorů
Operátory často tvoří zvláštní lexikální kategorii a zapisují se jedním nealfanumerickým znakem, případně řetězcem nealfanumerických znaků. V některých jazycích se mohou operátory zapisovat jako identifikátory nebo se může jednat o klíčová slova.
Syntaxe
Operátory se syntakticky obvykle výrazně odlišují od funkcí. Zatímco u funkcí zpravidla existuje jediný pevně stanovený způsob zápisu volání funkce (nejčastěji jméno funkce následované závorkami, které obsahují seznam parametrů vzájemně oddělených čárkami), operátory mohou používat odlišné způsoby zápisu.
Operátor mívá obvykle stanovenou
- Aritu – počet operandů, které vyžaduje; nejpoužívanější operátory jsou binární (se dvěma operandy), rozšířené jsou i unární (s jedním operandem), v některých jazycích jsou i operátory s vyšší aritou (především ternární se třemi operandy)
- Umístění vůči svému operandu nebo operandům – operátory mohou být prefixové (operátor se píše před operand nebo operandy), postfixové (operátor se píše za operand nebo operandy), binární operátory navíc též infixové (operátor se píše mezi operandy)
- Prioritu – jak těsně operátory vážou k sobě operandy v porovnání s jinými operátory (týká se infixových binárních operátorů, případně kombinace prefixových a postfixových unárních operátorů); přednostní vyhodnocení části výrazu lze obvykle předepsat pomocí závorek
- Asociativitu – zda je možné použít stejný operátor vícekrát a zda se při použití více operátorů vyhodnocuje výraz zleva doprava nebo zprava doleva
Sémantika
Sémantiku operátorů obvykle definuje norma jazyka. V některých jazycích je možné rozšiřovat operátory na nové typy, definovat vlastní operátory, případně chování operátorů předefinovávat. Sémantika operátoru může záviset na typech použitých operandů.
Druhy operátorů
Aritmetické operace
Většina programovacích jazyků používá binární operátory +
, -
, *
, /
pro sčítání, odčítání, násobení a dělení čísel. Pro celočíselné dělení se zbytkem se v některých jazycích používá zvláštní operátor div
, jiné jazyky použijí celočíselné dělení pokud jsou oba operandy celočíselné. Pro zbytek po celočíselném dělení se nejčastěji používá binární infixový operátor %
nebo mod
. Některé jazyky mají operátor pro umocňování, který má většinou asociativitu zprava.
Relační operace
Jako relační jsou zpravidla označovány operátory, které vracejí logickou (pravdivostní) hodnotu. Typicky mezi ně patří operátory pro test na rovnost a nerovnost zapisované =
nebo ==
(je rovno), příp. <>
, !=
, =/=
(není rovno), <
<=
, >
, >=
pro porovnávání čísel nebo lexikografické porovnávání řetězců. Některé jazyky používají operátory, jejichž jména jsou alfanumerické řetězce: obvykle eq
pro je rovno, ne
nebo neq
pro není rovno, lt
pro menší než, le
nebo lte
pro menší nebo rovno, ge
nebo gte
pro větší nebo rovno. Pro odlišení od identifikátorů se operátory v některých jazycích píší mezi tečky (.LT.
).
Některé jazyky mají pro porovnání dvou hodnot operátory <=>
a/nebo cmp
, které vracejí hodnoty -1, 0 nebo 1 pro menší než, rovno, větší než.
Logické operace
Většina jazyků má operátory pro logické operace: unární not
, !
nebo jiné pro logickou negaci and
, &
nebo &&
pro logickou konjunkci (a zároveň), or
, |
nebo ||
pro logickou disjunkci (nebo), případně xor
nebo ^
pro non-ekvivalenci (buď-anebo).
Při vyhodnocování binárních logických operátorů pro konjunkci a disjunkci je důležité, zda provádějí zkrácené (jazyk C) nebo úplné (standardní Pascal) vyhodnocení. Při zkráceném vyhodnocování se přeskakuje vyhodnocování podvýrazů, které nemohou ovlivnit logickou hodnotu celého výrazu; přeskakuje se vyhodnocování druhého operandu v konjunkci, pokud první operand je nepravdivý (výsledek konjunkce bude nepravdivý bez ohledu na hodnotu druhého operandu); podobně se přeskakuje vyhodnocování druhého operandu v disjunkci, pokud první operand je pravdivý (výsledek disjunkce bude pravdivý bez ohledu na hodnotu druhého operandu). Protože se často jedná o konstrukce, ve kterých by vyhodnocování druhého operandu skončilo chybou, jeví se zkrácené vyhodnocování jako užitečnější.
Příklad:
Konstrukce
while (ptr <> nil) and (ptr^.next <> nil) do ptr:=ptr^.next;
ve standardním Pascalu skončí chybou, pokud ukazatel ptr má na začátku hodnotu nil. Obdobnou konstrukci lze v jazyce C napsat takto:
while (ptr != NULL && ptr->next != NULL) ptr = ptr->next;
a lze ji použít pro posunutí ukazatele na předposlední prvek spojového seznamu.
Podmíněný výraz
Podmíněný výraz je konstrukce, která obsahuje logickou podmínku a další dva výrazy; podle logické hodnoty podmínky se použije buď jeden nebo druhý z výrazů.
V některých jazycích se podmíněný výraz zapisuje podobně jako podmíněný příkaz, tj. pomocí klíčových slov if
, then
, else
, jazyk C zavedl pro podmíněný výraz konstrukci podmínka ? výraz1 : výraz2
, která byla převzata do mnoha dalších jazyků.
Operátor přiřazení
Část jazyků považuje přiřazení za operátor, takže lze přiřazení použít v dalším výrazu.
V jiných jazycích (Pascal) se přiřazení vyskytuje pouze v příkazu přiřazení, takže přiřazení může být v příkazu nejvýše jedno, a symbol přiřazení lze považovat za oddělovač.
Vlastnosti operátorů v programovacích jazycích
Následující tabulka shrnuje vlastnosti operátorů v několika programovacích jazycích:
Programovací jazyk | Nealfanumerické operátory | Alfanumerické operátory | Prefixový | Infixový | Postfixový | Priorita | Asociativita | Přetěžování | Programátorem definované přetěžování | Programátorem definované symboly operátorů |
---|---|---|---|---|---|---|---|---|---|---|
ALGOL 68 | +* ** * / % %* %× - + < <= >= > = /= & -:= +:= *:= /:= %:= %*:= +=: :=: :/=:
(Všechny operátory mají alfanumerické ekvivalenty uvedené polotučně, viz další sloupec. některé mají ne-ASCII ekvivalenty, viz níže.) ¬ +× ⊥ ↑ ↓ ⌊ ⌈ × ÷ ÷× ÷* □ ≤ ≥ ≠ ∧ ∨ ×:= ÷:= ÷×:= ÷*:= %×:= :≠: |
not abs arg bin entier leng level odd repr round shorten i shl shr up down lwb upb lt le ge gt eq ne and or over mod elem minusab plusab timesab divab overab modab plusto is isnt | (prefixové operátory mají vždy prioritu 10) | Infixové operátory jsou asociativní zleva, prefixové operátory jsou asociativní zprava | ||||||
C | () [] -> . ! ~ ++ -- + - * & / % << >> < <= > <= == != ^ | && || ?: = += -= *= /= %= &= ^= |= <<= >>= | sizeof | ||||||||
C++ (more) | sizeof typeid new delete throw decltype static cast dynamic cast reinterpret cast const cast | |||||||||
Java | new instanceof | |||||||||
Haskell | + - * / ^ ^^ ** == /= > < >= <= && || >>= >> $ $! . ++ !! : Many more in common libraries | Jméno funkce musí být v obrácených apostrofech | , pomocí typových tříd | |||||||
Pascal | * / + - = < > <> <= >= := | not div mod and or in | ||||||||
Seed7 | {} [] -> ** ! + - * / << >> & >< | = <> > >= < <= <& := +:= -:= *:= /:= <<:= >>:= &:= @:= | conv varConv parse conj div rem mdiv mod times mult in not and or digits lpad rpad lpad0 | ||||||||
Eiffel | [] + - * / // = /= | not and or implies "and then" "or else" | ||||||||
Prolog | :- ?- ; , . =.. = \= < =< >= > == \== - + / * | spy nospy not is mod | ||||||||
Lisp | Lisp definuje všechny funkce a symboly jako operátory.[1] Podle definice na této stránce nemá Lisp žádné operátory. | (operátory jsou normální funkce) | ||||||||
Smalltalk | (Ano – max. 2 znaky[2]) | Za klíčovým slovem musí mít alfanumerické symboly dvojtečku | ||||||||
Perl | -> ++ -- ** ! ~ \ + - . =~ !~ * / % < > <= >= == != <=> ~~ & | ^ && || ' // .. ... ?: = += -= *= , => | print sort chmod chdir rand and or not xor lt gt le ge eq ne cmp x |
Odkazy
Reference
V tomto článku byl použit překlad textu z článku Operator (computer programming) na anglické Wikipedii.
- The Common Lisp HyperSpec [online]. Dostupné online.
- GOLDBERG, Adele. Smalltalk-80: The Language and its Implementation, p. 27, ISBN 0-201-11371-6 [online]. Dostupné online.