--- title: Operators description: Operators are symbols for performing an operation or conditional evaluation. --- An **operator** is a symbol for performing an operation or conditional evaluation. ## Logical Logical operators return values depending on the boolean values of the given arguments. If an argument isn't `false` or `nil`, then the operator evaluates it as `true`. Unlike many other languages, Luau considers both zero and the empty string as `true`. The following table summarizes how logical operators behave in [conditionals](./control-structures.md#if-statements).
Operator Descriptions
`and` Evaluates as `true` only if both conditions are true
`or` Evaluates as `true` if either condition is true
`not` Evaluates as the opposite of the condition
### and The binary operator `and` returns one of the two arguments. If the first argument evaluates to `true`, then it returns the second argument. Otherwise, it returns the first argument. ```lua print(4 and 5) -- 5 print(nil and 12) -- nil print(false and 12) -- false print(false and true) -- false print(false and false) -- false print(true and false) -- false print(true and true) -- true ``` You can use `and` to test multiple conditions in [control structures](./control-structures.md) such as [`if` statements](./control-structures.md#if-statements) and [`while` loops](./control-structures.md#while-loops). For example, the following `if`‑`then` statement tests that two conditions are both true: ```lua local pasta = true local tomatoSauce = true if pasta == true and tomatoSauce == true then print("We have spaghetti dinner") else print("Something is missing...") end -- Output: We have spaghetti dinner ``` ### or The binary operator `or` returns one of the two arguments. If the first argument evaluates to `true`, then it returns the first argument. Otherwise, it returns the second argument. ```lua local y = x or 1 print(y) -- 1 because x doesn't exist and is therefore nil local d = false local e = d or 1 print(e) -- 1 because d is false print(4 or 5) -- 4 print(nil or 12) -- 12 print(false or 12) -- 12 print(false or true) -- true print(false or false) -- false print(true or false) -- true print(true or true) -- true ``` You can use `or` to perform complex logical tests in [control structures](./control-structures.md). For example, the following `if`‑`then` statement tests whether two conditions are true **or** a third condition is true: ```lua local pasta = false local tomatoSauce = true local garlicBread = true if (pasta == true and tomatoSauce == true) or garlicBread == true then print("We have either spaghetti dinner OR garlic bread") else print("Something is missing...") end -- Output: We have either spaghetti dinner OR garlic bread ``` ### not The unary operator `not` returns the opposite boolean value of the argument. If the argument is `false` or `nil`, then it returns `true`. Otherwise, it returns `false`. ```lua print(not true) -- false print(not false) -- true print(not nil) -- true print(not "text") -- false print(not 0) -- false ``` You can use the `not` operator to trigger a conditional or loop if a variable is `false` or `nil`. ```lua local nilVariable -- Variable is declared but has no value, so it's nil local falseVariable = false -- Variable is declared with value of false if not nilVariable then print(nilVariable) -- Outputs "nil" because nil isn't true end if not falseVariable then print(falseVariable) -- Outputs "false" because false isn't true end ``` You can also use the `not` operator to test for the opposite of an entire multi-condition statement. In the following code sample, the `if`‑`then` conditional tests that it's neither true that three is greater than four nor is it true that five is greater than four. ```lua local three = 3 local four = 4 local five = 5 if not (three > four or five < four) then print("Three is less than 4 and five is greater than 4.") end -- Output: Three is less than 4 and five is greater than 4. ``` ## Relational Relational operators compare two parameters and return a [`boolean`](./booleans.md): `true` or `false`.
Operator Description Example Associated metamethod
`==` Equal to `3 == 5` → `false` `__eq`
`~=` Not equal to `3 ~= 5` → `true`
`>` Greater than `3 > 5` → `false`
`<` Less than `3 < 5` → `true` `__lt`
`>=` Greater than or equal to `3 >= 5` → `false`
`<=` Less than or equal to `3 <= 5` → `true` `__le`
## Arithmetic Luau supports the usual binary operators along with exponentiation, modulus, and unary negation.
Operator Description Example Associated metamethod
`+` Addition `1 + 1 = 2` `__add`
`-` Subtraction `1 - 1 = 0` `__sub`
`*` Multiplication `5 * 5 = 25` `__mul`
`/` Division `10 / 5 = 2` `__div`
`//` Floor Division `10 // 4 = 2`
`-10 // 4 = -3`
`__idiv`
`^` Exponentiation `2 ^ 4 = 16` `__pow`
`%` Modulus `13 % 7 = 6` `__mod`
`-` Unary negation `-2 = 0 - 2` `__unm`
## Compound assignment You can use compound assignment operators to set a variable equal to the result of an operation where the first parameter is the variable's current value. The operation in a compound assignment occurs once. For example, if an expression generates a random index in a table, Luau uses the same index for both the operation and the assignment. In the following examples, suppose `local x = 3`.
Operator Operation Example New Value of `x`
`+=` Addition `x += 2` `5`
`-=` Subtraction `x -= 2` `1`
`*=` Multiplication `x *= 2` `6`
`/=` Division `x /= 2` `1.5`
`//=` Floor Division `x //= 2` `1`
`%=` Modulus `x %= 2` `1`
`^=` Exponentiation `x ^= 2` `9`
`..=` Concatenation `x ..= " World!" ` `"3 World!"`
## Miscellaneous Miscellaneous operators include **concatenation** and **length**.
Operator Description Example Associated metamethod
`..` Concatenates two strings `print("Hello " .. "World!")` `__concat`
`#` Length of table If `tableVar = {1, 2, 3}`, then `#tableVar == 3`. `__len`