# Operator Precedence
The table below defines operator precedence from tightest-binding (top) to loosest-binding (bottom).
| Operator | Associativity | Grammar |
|--------------------------------------------------------------------------------------|----------------------|---------------------------------------------------------|
| **Binds tighter** | | |
| [`.` `->`](./datatypes_struct.md) | left | |
| `has`, [`is`, `matches`](./datatypes_enum.md) | left | V@[has_expr] V@[is_expr] V@[matches_expr] |
| [`*` `/` `%`](./spec-arithmetic.md) | left | V@[arith_expr] |
| [`+` `-`](./spec-arithmetic.md) | left | V@[arith_expr] |
| [`<<` `>>`](./spec-bit-ops.md) | left | V@[bit_expr] |
| [`&`](./spec-bit-ops.md) | left | V@[bit_expr] |
| [`^`](./spec-bit-ops.md) | left | V@[bit_expr] |
| [|](./spec-bit-ops.md) | left | V@[bit_expr] |
| [`!==` `==` `!=`](./spec-equality.md) `<=` `<` `>=` `>` | requires parentheses | V@[equality_expr] V@[ineq_expr] |
| `&&` | left | V@[and_expr] |
| || | left | V@[or_expr] |
| [`==>`](./reference-implication.md) | right | V@[implies_expr] |
| [`<==`](./reference-implication.md) | left | V@[explies_expr] |
| [`<==>`](./reference-implication.md) | requires parentheses | V@[iff_expr] |
| `..` | left | |
| `=` | right | |
| closures; [`forall`, `exists`](./spec-quantifiers.md); [`choose`](./spec-choose.md) | right | V@[forall_expr] V@[exists_expr] V@[choose_expr] |
| [`&&&`](./prefix-and-or.md) | left | V@[prefix_and_expr] |
| [|||](./prefix-and-or.md) | left | V@[prefix_or_expr] |
| **Binds looser** | | |
All operators that are from ordinary Rust have the same precedence-ordering as in
ordinary Rust.
See also the [Rust operator precedence](https://doc.rust-lang.org/reference/expressions.html).