# 44.2 Operations for Booleans

`bool1 or bool2`

The logical operator `or` evaluates to `true` if at least one of the two boolean operands bool1 and bool2 is `true` and to `false` otherwise.

`or` first evaluates bool1. If the value is neither `true` nor `false` an error is signalled. If the value is `true`, then `or` returns `true` without evaluating bool2. If the value is `false`, then `or` evaluates bool2. Again, if the value is neither `true` nor `false` an error is signalled. Otherwise `or` returns the value of bool2. This short-circuited evaluation is important if the value of bool1 is `true` and evaluation of bool2 would take much time or cause an error.

`or` is associative, i.e., it is allowed to write `b1 or b2 or b3`, which is interpreted as `(b1 or b2) or b3`. `or` has the lowest precedence of the logical operators. All logical operators have lower precedence than the comparison operators `=`, `<`, `in`, etc.

```    gap> true or false;
true
gap> false or false;
false
gap> i := -1;;  l := [1,2,3];;
gap> if i <= 0 or l[i] = false  then Print("aha\n");  fi;
aha    # no error, because 'l[i]' is not evaluated ```

`bool1 and bool2`

The logical operator `and` evaluates to `true` if both boolean operands bool1 and bool2 are `true` and to `false` otherwise.

`and` first evaluates bool1. If the value is neither `true` nor `false` an error is signalled. If the value is `false`, then `and` returns `false` without evaluating bool2. If the value is `true`, then `and` evaluates bool2. Again, if the value is neither `true` nor `false` an error is signalled. Otherwise `and` returns the value of bool2. This short-circuited evaluation is important if the value of bool1 is `false` and evaluation of bool2 would take much time or cause an error.

`and` is associative, i.e., it is allowed to write ```b1 and b2 and b3```, which is interpreted as `(b1 and b2) and b3`. `and` has higher precedence than the logical `or` operator, but lower than the unary logical `not` operator. All logical operators have lower precedence than the comparison operators `=`, `<`, `in`, etc.

```    gap> true and false;
false
gap> true and true;
true
gap> false and 17;
false    # is no error, because '17' is never looked at ```

`not bool`

The logical operator `not` returns `true` if the boolean value bool is `false` and `true` otherwise. An error is signalled if bool does not evaluate to `true` or `false`.

`not` has higher precedence than the other logical operators, `or` and `and`. All logical operators have lower precedence than the comparison operators `=`, `<`, `in`, etc.

```    gap> not true;
false
gap> not false;
true ```

GAP 3.4.4
April 1997