Some Terminology Arithmetical Operations Operations on Complex Types Comparison Logical Expressions Bitwise Operations Operations on Sets Indexing Assignment Type Conversions The Comma Operator Call and Splice Operator Precedence and Associativity

# Operator Precedence and Associativity

Operator precedence is why the expression 5 + 3 * 2 is calculated as 5 + (3 * 2), giving 11, and not as (5 + 3) * 2, giving 16.

We say that the multiplication operator (*) has higher "precedence" or "priority" than the addition operator (+), so the multiplication must be performed first.

Operator associativity is why the expression 8 - 3 - 2 is calculated as (8 - 3) - 2, giving 3, and and not as 8 - (3 - 2), giving 7.

We say that the subtraction operator (-) is "left associative", so the left subtraction must be performed first. When we can't decide by operator precedence alone in which order to calculate an expression, we must use associativity.

Since the operators + and - have the same precedence, and are left-associative, the following expressions are all equivalent:

```x + 3 - y + 5
(x + 3) - y + 5
((x + 3) - y) + 5
((x + 3) - y + 5)```

Since the operators =, += and -= have the same precedence, and are right-associative, the following expressions are all equivalent:

```x = y += z -= 4
x = y += (z -= 4)
x = (y += (z -= 4))
(x = y += (z -= 4))```

You can use parentheses to tell the compiler in which order to evaluate things. If you don't use parentheses, Pike will use the precedences and the associativities of the operators to decide in which order to perform them. Spaces have no effect.

This table shows the priority and associativity of each operator in Pike, with the highest priority at the top:

OperatorsAssociativity

::a a::b

left to right

a() a[b] a->b a[b..c] ({}) ([]) (<>)

left to right

a++ a--

left to right

!a ~a (type)a ++a --a

right to left!

a*b a/b a%b

left to right

a+b a-b

left to right

a>>b a<<b

left to right

a>b a>=b a<b a<=b

left to right

a==b a!=b

left to right

a&b

left to right

a^b

left to right

a|b

left to right

&&

left to right

||

left to right

a?b:c

right to left!

```=
+=
-=
*=
/=
%=
<<=
>>=
&=
|=
^=```

right to left!

@a

right to left!

,

left to right

Examples:

This expression is evaluated in this order

1+2*2

1+(2*2)

1+2*2*4

1+((2*2)*4)

(1+2)*2*4

((1+2)*2)*4

1+4,c=2|3+5

(1+4),(c=(2|(3+5)))

1 + 5&4 == 3

(1 + 5) & (4 == 3)

c=1,99

(c=1),99

!a++ + ~f()

(!(a++)) + (~(f()))

s == "klas" || i < 9

(s == "klas") || (i < 9)

r = s == "sten"

r = (s == "sten")