Operator (computer programming)
Programming languages generally support a set of operators that are similar to operators in mathematics. A language may contain a fixed number of built-in operators (e.g. + - * = in C and C++), or it may allow the creation of programmer-defined operators (e.g. Haskell). Some programming languages restrict operator symbols to special characters like + or := while others allow also names like div (e.g. Pascal).
Some built-in operators supported by a language have a direct mapping to a small number of instructions commonly found on central processing units, though others (e.g. '+' used to express string concatenation) may have complicated implementations.
The specification of a language will specify the precedence and associativity of the operators it supports. Languages which support programmer-defined operators require the specification of the precedence and associativity of new operator symbols (e.g. Prolog).
Most programming language operators take one or two operands, with a few supporting more operands (e.g., the ?: operator in C). The position of the operator with respect to its operands may be prefix, infix or postfix.
Syntactically operators contrast to functions which don't have precedence and associativity and usually use a calling notation with parentheses (e.g. myFunc(param1, param2)
or (myFunc param1 param2)
in LISP). Consequently a language which supports programmer-defined functions cannot claim that it supports programmer-defined operators. Semantically operators can be seen as special form of function with different calling notation and a limited set of parameters.
Operator overloading
In some programming languages an operator may be ad-hoc polymorphic, that is, have definitions for more than one kind of data, (such as in Java where the + operator is used both for the addition of numbers and for the concatenation of strings). Such an operator is said to be overloaded. In languages that support operator overloading by the programmer but have a limited set of operators, operator overloading is often used to define customized uses for operators.
Operand coercion
Some languages also allow for the operands of an operator to be implicitly converted, or coerced, to suitable data types for the operation to occur. For example, in Perl coercion rules lead into 12 + "3.14"
producing the result of 15.14
. The text "3.14"
is converted to the number 3.14 before addition can take place. Further, 12
is an integer and 3.14
is either a floating or fixed-point number (a number that has a decimal place in it) so the integer is then converted to a floating point or fixed-point number respectively.
Javascript follows opposite rules—finding the same expression above, it will convert the integer 12
into a string "12"
, then concatenate the two operands to form "123.14"
.
In the presence of coercions in a language, the programmer must be aware of the specific rules regarding operand types and the operation result type to avoid subtle programming mistakes.
- See Type conversion for more information about coercion.
Operator features in programming languages
The following table shows the operator features in several programming languages:
Programming language | Nonalphanumeric operator symbols | Alphanumeric operator symbols | prefix | infix | postfix | precedence | associativity | overloading | programmer-defined overloading | programmer-defined operator symbols |
---|---|---|---|---|---|---|---|---|---|---|
ALGOL 68 | +* ** * / % %* %× - + < <= >= > = /= & -:= +:= *:= /:= %:= %*:= +=: :=: :/=:
(All operators have bold Alphanumeric equivalents, c.f. next column. Some have non ASCII equivalents, c.f. below.) ¬ +× ⊥ ↑ ↓ ⌊ ⌈ × ÷ ÷× ÷* □ ≤ ≥ ≠ ∧ ∨ ×:= ÷:= ÷×:= ÷*:= %×:= :≠: |
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 | yes | yes | no | yes (prefix operators always have priority 10) | infix operators are left associative, prefix operators are right associative | yes | yes | yes |
C | () [] -> . ! ~ ++ -- + - * & / % << >> < <= > <= == != ^ | && || ?: = += -= *= /= %= &= ^= |= <<= >>= | sizeof | yes | yes | yes | yes | yes | yes | no | no |
C++ (more) | () [] -> . ! ~ ++ -- + - * & / % << >> < <= > <= == != ^ | && || ?: = += -= *= /= %= &= ^= |= <<= >>= | sizeof new | yes | yes | yes | yes | yes | yes | yes | no |
Java | () [] -> . ! ~ ++ -- + - * & / % << >> < <= > <= == != ^ | && || ?: = += -= *= /= %= &= ^= |= <<= >>= | new instanceof | yes | yes | yes | yes | yes | yes | no | no |
Pascal | * / + - = < > <> <= >= := | not div mod and or in | yes | yes | no | yes | yes | yes | no | no |
Prolog | :- ?- ; , . =.. = \= < =< >= > == \== - + / * | spy nospy not is mod | yes | yes | yes | yes | yes | no | no | yes |
Smalltalk | (yes - Up to two characters[1]) | (yes - Needs a colon after the keyword) | no | yes | yes | no | no | yes | yes | yes |
References
- ^ Goldberg, Adele. "Smalltalk-80: The Language and its Implementation, p. 27, ISBN 0-201-11371-6" (PDF).