## Operators
An operator is a special symbol or phrase that you use to check, change, or combine values. For example, the addition operator (+) adds two numbers, as in **var i = 1 + 2**, and the logical AND operator (&&) combines two Boolean values, as in **if (flag1 && flag2)**.
Gravity supports most standard C operators and improves several capabilities to eliminate common coding errors. The assignment operator (=) does not return a value, to prevent it from being mistakenly used when the equal to operator (==) is intended. Gravity also provides two [range](types.md) operators as a shortcut for expressing a range of values.
### Arithmetic Operators
* Addition (+)
* Subtraction (-)
* Multiplication (*)
* Division (/)
* Remainder (%)
```swift
var n1 = 1 + 2 // equals 3
var n2 = 5 - 3 // equals 2
var n3 = 2 * 3 // equals 6
var n4 = 10.0 / 2.5 // equals 4.0
var n5 = 9 % 4 // equals 1
```
### Assignment Operator
The assignment operator = initialize or update a value:
```swift
var a = 50; // a = 50
var b = a; // b = 50
var c = a * b; // c = 50 * 50
```
Please note that contrary to many other programming languages, the assignment operator has no side effect, it means that it does not return any value.
### Comparison Operators
The comparison operators return a Bool value to indicate whether or not the statement is true:
* Equal (==)
* Not equal (!=)
* Less than (<)
* Less than or equal (<=)
* Greater than (>)
* Greater than or equal (>=)
* Identical (===)
* Not identical (!==)
* Type check (is)
* Pattern match (~=)
```swift
1 == 1 // true because 1 is equal to 1
1 != 2 // true because 1 is not equal to 2
1 < 2 // true because 1 is less than 2
1 <= 1 // true because 1 is less than or equal to 1
1 > 2 // false because 1 is not greater than 2
1 >= 1 // true because 1 is greater than or equal to 1
1 === 1 // true because 1 is identical to 1 (same value and same class)
1 is Int // true because 1 is of class Int
```
Gravity performs some conversions at runtime, so 1 == "1" but not 1 === '1'.
### Logical Operators
The comparison operators return a Bool value to indicate whether or not the statement is true:
* Logical NOT (!)
* Logical AND (&&)
* Logical OR (||)
```swift
!1 // false because 1 is true
1 && 0 // false because one of the two values is false
1 || 0 // true because one of the two values is true
```
In order to improve code readability the reserved keywords **not, and, or** has been introduces as an alisas to logical operators.
### Bitwise Operators
* Bitwise shift left (<<)
* Bitwise shift right (>>)
* Bitwise AND (&)
* Bitwise OR (|)
* Bitwise XOR (^)
* Bitwise NOT or one's complement (~)
```swift
var n = 0B00110011;
var n1 = n << 2 // equals 11001100
var n2 = n >> 2 // equals 00001100
var n3 = n & 0B00001111 // equals 00000011
var n4 = n | 0B00001111 // equals 00111111
var n5 = n ^ 0B00001111 // equals 00111100
var n6 = ~n; // equals 11001100
```
### Compound Assignment Operators
As a shortcut, assignment and operators can be combined together:
* Multiply and assign (*=)
* Divide and assign (/=)
* Remainder and assign (%=)
* Add and assign (+=)
* Subtract and assign (-=)
* Left bit shift and assign (<<=)
* Right bit shift and assign (>>=)
* Bitwise AND and assign (&=)
* Bitwise XOR and assign (^=)
* Bitwise OR and assign (|=)