Operátor (programování)

Z Wikipedie, otevřené encyklopedie
Skočit na navigaci Skočit na vyhledává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ů[editovat | editovat zdroj]

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[editovat | editovat zdroj]

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[editovat | editovat zdroj]

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ů[editovat | editovat zdroj]

Aritmetické operace[editovat | editovat zdroj]

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[editovat | editovat zdroj]

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[editovat | editovat zdroj]

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[editovat | editovat zdroj]

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í[editovat | editovat zdroj]

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[editovat | editovat zdroj]

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 AnoAno AnoAno NeNe AnoAno (prefixové operátory mají vždy prioritu 10) Infixové operátory jsou asociativní zleva, prefixové operátory jsou asociativní zprava AnoAno AnoAno AnoAno
C () [] -> . ! ~ ++ -- + - * & / % << >> < <= > <= == != ^ | && || ?: = += -= *= /= %= &= ^= |= <<= >>= sizeof AnoAno AnoAno AnoAno AnoAno AnoAno AnoAno NeNe NeNe
C++ (more) sizeof typeid new delete throw decltype static_cast dynamic_cast reinterpret_cast const_cast AnoAno AnoAno AnoAno AnoAno AnoAno AnoAno AnoAno NeNe
Java new instanceof AnoAno AnoAno AnoAno AnoAno AnoAno AnoAno NeNe NeNe
Haskell + - * / ^ ^^ ** == /= > < >= <= && || >>= >> $ $! . ++ !! : Many more in common libraries Jméno funkce musí být v obrácených apostrofech AnoAno AnoAno NeNe AnoAno AnoAno AnoAno, pomocí typových tříd AnoAno
Pascal * / + - = < > <> <= >= := not div mod and or in AnoAno AnoAno NeNe AnoAno AnoAno AnoAno NeNe NeNe
Seed7 {} [] -> ** ! + - * / << >> & >< | = <> > >= < <= <& := +:= -:= *:= /:= <<:= >>:= &:= @:= conv varConv parse conj div rem mdiv mod times mult in not and or digits lpad rpad lpad0 AnoAno AnoAno AnoAno AnoAno AnoAno AnoAno AnoAno AnoAno
Eiffel [] + - * / // = /= not and or implies "and then" "or else" AnoAno AnoAno NeNe AnoAno AnoAno NeNe AnoAno AnoAno
Prolog :- ?- ; , . =.. = \= < =< >= > == \== - + / * spy nospy not is mod AnoAno AnoAno AnoAno AnoAno AnoAno NeNe NeNe AnoAno
Lisp Lisp 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) NeNe NeNe NeNe NeNe NeNe NeNe AnoAno
Smalltalk (Ano – max. 2 znaky[2]) Za klíčovým slovem musí mít alfanumerické symboly dvojtečku NeNe AnoAno AnoAno NeNe NeNe AnoAno AnoAno AnoAno
Perl -> ++ -- ** ! ~ \ + - . =~ !~ * / % < > <= >= == != <=> ~~ & | ^ && || ' // .. ... ?: = += -= *= , => print sort chmod chdir rand and or not xor lt gt le ge eq ne cmp x AnoAno AnoAno AnoAno AnoAno AnoAno AnoAno AnoAno NeNe

Odkazy[editovat | editovat zdroj]

Reference[editovat | editovat zdroj]

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[editovat | editovat zdroj]