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ůEditovat

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.

SyntaxeEditovat

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émantikaEditovat

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

Aritmetické operaceEditovat

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í operaceEditovat

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é operaceEditovat

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ýrazEditovat

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

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íchEditovat

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

OdkazyEditovat

ReferenceEditovat

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