Operators

Operators

There is no operator overloading. When you see an operator in Zig, you know that it is doing something from this table, and nothing else.

Table of Operators

Syntax Relevant Types Description Example
a + b
a += b
```  |  \- Integers \- Floats | Addition. \- Can cause overflow for integers. \- Invokes Peer Type Resolution for the operands. \- See also @addWithOverflow.  |  ```
2 + 5 == 7
a +% b
a +%= b
```  |  \- Integers | Wrapping Addition. \- Guaranteed to have twos-complement wrapping behavior. \- Invokes Peer Type Resolution for the operands. \- See also @addWithOverflow.  |  ```
u32(std.math.maxInt(u32)) +% 1 == 0
a - b
a -= b
```  |  \- Integers \- Floats | Subtraction. \- Can cause overflow for integers. \- Invokes Peer Type Resolution for the operands. \- See also @subWithOverflow.  |  ```
2 - 5 == -3
a -% b
a -%= b
```  |  \- Integers | Wrapping Subtraction. \- Guaranteed to have twos-complement wrapping behavior. \- Invokes Peer Type Resolution for the operands. \- See also @subWithOverflow.  |  ```
u32(0) -% 1 == std.math.maxInt(u32)
-a
```  |  \- Integers \- Floats |  Negation. \- Can cause overflow for integers.  |  ```
-1 == 0 - 1
-%a
```  |  \- Integers |  Wrapping Negation. \- Guaranteed to have twos-complement wrapping behavior.  |  ```
-%i32(std.math.minInt(i32)) == std.math.minInt(i32)
a  b
a = b
```  |  \- Integers \- Floats | Multiplication. \- Can cause overflow for integers. \- Invokes Peer Type Resolution for the operands. \- See also @mulWithOverflow.  |  ```
2  5 == 10
``` __  

a % b a %= b __ | \- Integers | Wrapping Multiplication. \- Guaranteed to have twos-complement wrapping behavior. \- Invokes Peer Type Resolution for the operands. \- See also @mulWithOverflow. | u8(200) % 2 == 144

a / b a /= b | \- Integers \- Floats | Division. \- Can cause overflow for integers. \- Can cause Division by Zero for integers. \- Can cause Division by Zero for floats in FloatMode.Optimized Mode. \- For non-compile-time-known signed integers, must use @divTrunc, @divFloor, or @divExact instead of `/`. \- Invokes Peer Type Resolution for the operands. | 10 / 5 == 2

a % b a %= b | \- Integers \- Floats | Remainder Division. \- Can cause Division by Zero for integers. \- Can cause Division by Zero for floats in FloatMode.Optimized Mode. \- For non-compile-time-known signed integers, must use @rem or @mod instead of `%`. \- Invokes Peer Type Resolution for the operands. | 10 % 3 == 1

a << b a <<= b | \- Integers | Bit Shift Left. \- `b` must be comptime-known or have a type with log2 number of bits as `a`. \- See also @shlExact. \- See also @shlWithOverflow. | 1 << 8 == 256

a >> b a >>= b | \- Integers | Bit Shift Right. \- `b` must be comptime-known or have a type with log2 number of bits as `a`. \- See also @shrExact. | 10 >> 1 == 5

a & b a &= b | \- Integers | Bitwise AND. \- Invokes Peer Type Resolution for the operands. | 0b011 & 0b101 == 0b001

a | b a |= b | \- Integers | Bitwise OR. \- Invokes Peer Type Resolution for the operands. | 0b010 | 0b100 == 0b110

a ^ b a ^= b | \- Integers | Bitwise XOR. \- Invokes Peer Type Resolution for the operands. | 0b011 ^ 0b101 == 0b110

~a | \- Integers | Bitwise NOT. | ~u8(0b0101111) == 0b1010000

a orelse b | \- Optionals | If `a` is `null`, returns `b` ("default value"), otherwise returns the unwrapped value of `a`. Note that `b` may be a value of type noreturn. | const value: ?u32 = null; const unwrapped = value orelse 1234; unwrapped == 1234

a.? | \- Optionals | Equivalent to: a orelse unreachable | const value: ?u32 = 5678; value.? == 5678

a catch b a catch |err| b | \- Error Unions | If `a` is an `error`, returns `b` ("default value"), otherwise returns the unwrapped value of `a`. Note that `b` may be a value of type noreturn. `err` is the `error` and is in scope of the expression `b`. | const value: anyerror!u32 = error.Broken; const unwrapped = value catch 1234; unwrapped == 1234

a and b | \- bool | If `a` is `false`, returns `false` without evaluating `b`. Otherwise, returns `b`. | false and true == false

a or b | \- bool | If `a` is `true`, returns `true` without evaluating `b`. Otherwise, returns `b`. | false or true == true

!a | \- bool | Boolean NOT. | !false == true

a == b | \- Integers \- Floats \- bool \- type | Returns `true` if a and b are equal, otherwise returns `false`. Invokes Peer Type Resolution for the operands. | (1 == 1) == true

a == null | \- Optionals | Returns `true` if a is `null`, otherwise returns `false`. | const value: ?u32 = null; value == null

a != b | \- Integers \- Floats \- bool \- type | Returns `false` if a and b are equal, otherwise returns `true`. Invokes Peer Type Resolution for the operands. | (1 != 1) == false

a > b | \- Integers \- Floats | Returns `true` if a is greater than b, otherwise returns `false`. Invokes Peer Type Resolution for the operands. | (2 > 1) == true

a >= b | \- Integers \- Floats | Returns `true` if a is greater than or equal to b, otherwise returns `false`. Invokes Peer Type Resolution for the operands. | (2 >= 1) == true

a < b | \- Integers \- Floats | Returns `true` if a is less than b, otherwise returns `false`. Invokes Peer Type Resolution for the operands. | (1 < 2) == true>

a <= b | \- Integers \- Floats | Returns `true` if a is less than or equal to b, otherwise returns `false`. Invokes Peer Type Resolution for the operands. | (1 <= 2) == true

a ++ b | \- Arrays | Array concatenation. \- Only available when `a` and `b` are compile-time known. | const mem = @import("std").mem; const array1 = []u32{1,2}; const array2 = []u32{3,4}; const together = array1 ++ array2; mem.eql(u32, together, []u32{1,2,3,4})

a b **** | \- Arrays | Array multiplication. \- Only available when `a` and `b` are compile-time known. | const mem = @import("std").mem; const pattern = "ab" 3; mem.eql(u8, pattern, "ababab")

a. __ | \- Pointers | Pointer dereference. | const x: u32 = 1234; const ptr = &x; ptr. == 1234

&a | All types | Address of. | const x: u32 = 1234; const ptr = &x; ptr.* == 1234

a || b | \- Error Set Type | Merging Error Sets | const A = error{One}; const B = error{Two}; (A || B) == error{One, Two}


## Precedence

x() x[] x.y a!b !x -x -%x ~x &x ?x x{} x. x.? ! * / % ** % || + - ++ +% -% << >> & ^ | == != < > <= >= and or orelse catch = *= /= %= += -= <<= >>= &= ^= |= ```