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

Podrobnější informace naleznete v článku Ternární operátor (programování).

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í

Podrobnější informace naleznete v článku 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í jazykNealfanumerické operátoryAlfanumerické operátoryPrefixovýInfixovýPostfixovýPrioritaAsociativitaPř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 isntAnoAnoAnoAnoNeNeAnoAno (prefixové operátory mají vždy prioritu 10)Infixové operátory jsou asociativní zleva, prefixové operátory jsou asociativní zpravaAnoAnoAnoAnoAnoAno
C() [] -> . ! ~ ++ -- + - * & / % << >> < <= > <= == != ^ | && || ?: = += -= *= /= %= &= ^= |= <<= >>=sizeofAnoAnoAnoAnoAnoAnoAnoAnoAnoAnoAnoAnoNeNeNeNe
C++ (more)sizeof typeid new delete throw decltype static cast dynamic cast reinterpret cast const castAnoAnoAnoAnoAnoAnoAnoAnoAnoAnoAnoAnoAnoAnoNeNe
Javanew instanceofAnoAnoAnoAnoAnoAnoAnoAnoAnoAnoAnoAnoNeNeNeNe
Haskell+ - * / ^ ^^ ** == /= > < >= <= && || >>= >> $ $! . ++ !! : Many more in common librariesJméno funkce musí být v obrácených apostrofechAnoAnoAnoAnoNeNeAnoAnoAnoAnoAnoAno, pomocí typových třídAnoAno
Pascal* / + - = < > <> <= >= :=not div mod and or inAnoAnoAnoAnoNeNeAnoAnoAnoAnoAnoAnoNeNeNeNe
Seed7{} [] -> ** ! + - * / << >> & >< | = <> > >= < <= <& := +:= -:= *:= /:= <<:= >>:= &:= @:=conv varConv parse conj div rem mdiv mod times mult in not and or digits lpad rpad lpad0AnoAnoAnoAnoAnoAnoAnoAnoAnoAnoAnoAnoAnoAnoAnoAno
Eiffel[] + - * / // = /=not and or implies "and then" "or else"AnoAnoAnoAnoNeNeAnoAnoAnoAnoNeNeAnoAnoAnoAno
Prolog:- ?- ; , . =.. = \= < =< >= > == \== - + / *spy nospy not is modAnoAnoAnoAnoAnoAnoAnoAnoAnoAnoNeNeNeNeAnoAno
LispLisp definuje všechny funkce a symboly jako operátory.[1] Podle definice na této stránce nemá Lisp žádné operátory.AnoAno (operátory jsou normální funkce)NeNeNeNeNeNeNeNeNeNeNeNeAnoAno
Smalltalk(Ano – max. 2 znaky[2])Za klíčovým slovem musí mít alfanumerické symboly dvojtečkuNeNeAnoAnoAnoAnoNeNeNeNeAnoAnoAnoAnoAnoAno
Perl-> ++ -- ** ! ~ \ + - . =~ !~ * / % < > <= >= == != <=> ~~ & | ^ && || ' // .. ... ?: = += -= *= , =>print sort chmod chdir rand and or not xor lt gt le ge eq ne cmp xAnoAnoAnoAnoAnoAnoAnoAnoAnoAnoAnoAnoAnoAnoNeNe

Odkazy

Reference

V tomto článku byl použit překlad textu z článku Operator (computer programming) na anglické Wikipedii.

  1. The Common Lisp HyperSpec [online]. Dostupné online. 
  2. GOLDBERG, Adele. Smalltalk-80: The Language and its Implementation, p. 27, ISBN 0-201-11371-6 [online]. Dostupné online. 

Související články

Externí odkazy

Média použitá na této stránce

Symbol confirmed.svg
A green check symbol.
Symbol delete vote darkened.svg
cancel symbol dark red