\chapter{Operators}\label{ch:operators} The operators recognized by \aprepro{} are listed below. The letters \textbf{a} and \textbf{b} can represent variables, numbers, functions, or expressions unless otherwise noted. The tables below also list the precedence and associativity of the operators. {\em Precedence} defines the order in which operations should be performed. For example, in the expression: \begin{apinp} \{3 * 4 + 6 / 2\} \end{apinp} the multiplications and divisions are performed first, followed by the addition because multiplication and division have higher precedence (10) than addition (9). The precedence is listed from 1 to 14 with 1 being the lowest precedence and 14 being the highest. {\em Associativity} defines which side of the expressions should be simplified first. For example the expression: \cmd{3 + 4 + 5} would be evaluated as \cmd{(3 + 4) + 5} since addition is left associative; in the expression \textbf{a = b / c}, the \cmd{b/c} would be evaluated first followed by the assignment of that result to \cmd{a} since equality is right associative \section{Arithmetic Operators} Arithmetic operators combine two or more algebraic expressions into a single algebraic expression. These have obvious meanings except for the pre- and post- increment and decrement operators. The pre-increment and pre-decrement operators first increment or decrement the value of the variable and then return the value. For example, if \cmd{a = 1}, then \cmd{b=++a} will set both \cmd{b} and \cmd{a} equal to \cmd{2}. The post-increment and post-decrement operators first return the value of the variable and then increment or decrement the variable. For example, if \cmd{a = 1}, then \cmd{b=a++} will set \cmd{b} equal to \cmd{1} and \cmd{a} equal to \cmd{2}. The modulus operator \cmd{\%} calculates the integer remainder. That is both expressions are truncated an integer value and then the remainder calculated. See the \cmd{fmod} function in Table~\ref{t:functions} for the calculation of the floating point remainder. The tilde character \cmd{\textasciitilde{}} is used as a synonym for multiplication to improve the aesthetics of the unit conversion system (see Chapter~\ref{ch:units}). It is more natural for some users to type \cmd{12\textasciitilde{}metre} than \cmd{12*metre}. \begin{longtable}{llcc} \caption{Arithmetic Operators}\\ Syntax & Description & Precedence & Associativity\\ \hline \cmd{a+b} & Addition & 9 & left \\ \cmd{a-b} & Subtraction & 9 & left \\ \cmd{a*b}, \cmd{a}\verb+~+\cmd{b} & Multiplication & 10 & left \\ \cmd{a/b} & Division & 10 & left \\ \cmd{a\^{}b}, \cmd{a**b} & Exponentiation & 12 & right \\ \cmd{a\%b} & Modulus, (remainder) & 10 & left \\ \cmd{++a}, \cmd{a++} & Pre- and Post-increment a & 13 & left\\ \cmd{\texttt{--}a}, \cmd{a\texttt{--}} & Pre- and Post-decrement a & 13 & left\\ \end{longtable} \section{Assignment Operators} Assignment operators combine a variable and an algebraic expression into a single algebraic expression, and also set the variable equal to the algebraic expression. Only variables can be specified on the left-hand-side of the equal sign. \begin{longtable}{llcc} \caption{Assignment Operators}\\ Syntax & Description & Precedence & Associativity \\ \hline \cmd{a=b} & The value of $a$ is set equal to $b$ & 1 & right\\ \cmd{a+=b} & The value of $a$ is set equal to $a + b$ & 2 & right\\ \cmd{a-=b} & The value of $a$ is set equal to $a - b$ & 2 & right\\ \cmd{a*=b} & The value of $a$ is set equal to $a * b$ & 3 & right\\ \cmd{a/=b} & The value of $a$ is set equal to $a / b$ & 3 & right\\ \cmd{a}\^{}\cmd{=b}, a\cmd{**=b}& The value of $a$ is set equal to $a^b$ & 4 & right\\ \end{longtable} \section{Relational Operators}\label{sec:relationaloperators} Relational operators combine two algebraic expressions into a single relational expression. Relational expressions and operators can only be used before the question mark (\cmd{?}) in a conditional expression. \begin{longtable}{llcc} \caption{Relational Operators}\\ Syntax & Description & Precedence & Associativity \\ \hline \cmd{a \texttt{<} b} & true if $a$ is less than $b$ & 8 & left\\ \cmd{a \texttt{>} b} & true if $a$ is greater than $b$ & 8 & left\\ \cmd{a \texttt{<}= b} & true if $a$ is less than or equal to $b$ & 8 & left\\ \cmd{a \texttt{>}= b} & true if $a$ is greater than or equal to $b$ & 8 & left\\ \cmd{a == b} & true if $a$ is equal to $b$ & 8 & left\\ \cmd{a != b} & true if $a$ is not equal to $b$ & 8 & left\\ \end{longtable} \section{Boolean Operators} Boolean operators combine one or more relational expressions into a single relational expression. If \cmd{la} and \cmd{lb} are two relational expressions, then: \begin{longtable}{llcc} \caption{Boolean Operators}\\ Syntax & Description & Precedence & Associativity \\ \hline \cmd{la \textbar{}\textbar{} lb} & true if either $la$ or $lb$ are true. & 6 & left\\ \cmd{la \&\& lb} & true if both $la$ and $lb$ are true. & 7 & left\\ \cmd{!la} & true if $la$ is false. & 11 & left\\ \end{longtable} The evaluation of the expression is not short-circuited if the truth value can be determined early; both sides of the expression are evaluated and then the truth of the expression is returned. \section{String Operators} The only supported string operator at this time is string concatenation which is denoted by \cmd{//}. For example, \begin{apinp} \{a = "Hello"\} \{b = "World"\} \{c = a // " " // b\} \end{apinp} sets \cmd{c} equal to \cmd{\texttt{"}Hello World\texttt{"}.} Concatenation has precedence 14 and left associativity.