Precedence | Operator | Type | Associativity | Description
--- | --- | --- | --- | ---
512 | `...` | prefix | n/a | Spread operator
=> 300 | `|` | infix | Left | Twig filter call
| `(` |  |  | Twig function call
| `.`, `?.` |  |  | Get an attribute on a variable
| `[` |  |  | Array access
500 | `-` | prefix | n/a |
| `+` |  |  |
300 => 5 | `??` | infix | Right | Null coalescing operator (a ?? b)
250 | `=>` | infix | Left | Arrow function (x => expr)
200 | `**` | infix | Right | Exponentiation operator
100 | `is` | infix | Left | Twig tests
| `is not` |  |  | Twig tests
60 | `*` | infix | Left |
| `/` |  |  |
| `//` |  |  | Floor division
| `%` |  |  |
50 => 70 | `not` | prefix | n/a |
40 => 27 | `~` | infix | Left |
30 | `+` | infix | Left |
| `-` |  |  |
25 | `..` | infix | Left |
20 | `==` | infix | Left |
| `!=` |  |  |
| `<=>` |  |  |
| `<` |  |  |
| `>` |  |  |
| `>=` |  |  |
| `<=` |  |  |
| `not in` |  |  |
| `in` |  |  |
| `matches` |  |  |
| `starts with` |  |  |
| `ends with` |  |  |
| `has some` |  |  |
| `has every` |  |  |
| `===` |  |  |
| `!==` |  |  |
18 | `b-and` | infix | Left |
17 | `b-xor` | infix | Left |
16 | `b-or` | infix | Left |
15 | `and` | infix | Left |
12 | `xor` | infix | Left |
10 | `or` | infix | Left |
5 | `?:`, `? :` | infix | Right | Elvis operator (a ?: b)
0 | `(` | prefix | n/a | Explicit group expression (a)
| `?` | infix | Left | Conditional operator (a ? b : c)
| `=` |  | Right | Assignment operator
| `literal` | prefix | n/a | A literal value (boolean, string, number, sequence, mapping, …)

When a precedence will change in 4.0, the new precedence is indicated by the arrow `=>`.

Here is the same table for Twig 4.0 with adjusted precedences:

Precedence | Operator | Type | Associativity | Description
--- | --- | --- | --- | ---
512 | `...` | prefix | n/a | Spread operator
| `(` | infix | Left | Twig function call
| `.`, `?.` |  |  | Get an attribute on a variable
| `[` |  |  | Array access
500 | `-` | prefix | n/a |
| `+` |  |  |
300 | `|` | infix | Left | Twig filter call
250 | `=>` | infix | Left | Arrow function (x => expr)
200 | `**` | infix | Right | Exponentiation operator
100 | `is` | infix | Left | Twig tests
| `is not` |  |  | Twig tests
70 | `not` | prefix | n/a |
60 | `*` | infix | Left |
| `/` |  |  |
| `//` |  |  | Floor division
| `%` |  |  |
30 | `+` | infix | Left |
| `-` |  |  |
27 | `~` | infix | Left |
25 | `..` | infix | Left |
20 | `==` | infix | Left |
| `!=` |  |  |
| `<=>` |  |  |
| `<` |  |  |
| `>` |  |  |
| `>=` |  |  |
| `<=` |  |  |
| `not in` |  |  |
| `in` |  |  |
| `matches` |  |  |
| `starts with` |  |  |
| `ends with` |  |  |
| `has some` |  |  |
| `has every` |  |  |
| `===` |  |  |
| `!==` |  |  |
18 | `b-and` | infix | Left |
17 | `b-xor` | infix | Left |
16 | `b-or` | infix | Left |
15 | `and` | infix | Left |
12 | `xor` | infix | Left |
10 | `or` | infix | Left |
5 | `??` | infix | Right | Null coalescing operator (a ?? b)
| `?:`, `? :` |  |  | Elvis operator (a ?: b)
0 | `(` | prefix | n/a | Explicit group expression (a)
| `?` | infix | Left | Conditional operator (a ? b : c)
| `=` |  | Right | Assignment operator
| `literal` | prefix | n/a | A literal value (boolean, string, number, sequence, mapping, …)