# Lecture for February 6th

## If Statements -- Cont.

Inside the parenthesis of the `if` statement must be a boolean expression. This is an expression that evaluates to either `true` or `false`. We can do more complex boolean expressions through logical operators.

## Logical Operators

NOT `!a` this is true when `a` is false

AND `a && b` this is true when both operands are true

OR `a || b` this is true when either a is true OR b is true

## Truth Tables

- Show all possible outcomes
- It breaks the expression down into parts

### Not

Let's look at the most simplest case. Not.

a | !a
--- | ---
true | false
false | true

### AND

a | b | a && b
--- | --- | ---
true | true | true
true | false | false
false | true | false
false | false | false

Notice here that `a && b` is only true when both `a` and `b` are true.

### OR

a | b | a \ | \ | b
--- | --- | --- | --- | ---
true | true | true
true | false | true
false | true | true
false | false | false

Notice here that `a || b` is only false when both `a` and `b` are false.

## Precedence (Order of Operations)

Parenthesis | `()`
Logical Not | `!`
Arithmetic Operators | `*` `/` `%` `+` `-`
Relational Operators | `<` `<=` `>` `>=`
Equality and Inequality operators | `==` `!=`
Logical AND | `&&`
Logical OR | `||`

## Playing with Truth Tables Example

### a && !b

a | b | !b | a && !b
--- | --- | --- | ---
true | true | false | false
true | false | true | true
false | true | false | false
false | false | true | false

### !a || b

a | b | !a | !a \ | \ | b
--- | --- | --- | --- | --- | ---
true | true | false | true
true | false | false | false
false | true | true | true
false | false | true | true

### !(a || b && c)

a | b | c | b && c | a \ | \ | (b && c) | !(a \ | \ | b && c)
--- | --- | --- | --- | --- | --- | --- | --- | --- | ---
true | true | true | true | true | false
true | true | false | false | true | false
true | false | true | false | true | false
false | true | true | true | true | false
true | true | false | false | true | false
true | false | true | false | true | false
false | true | true | true | true | false
false | false | false | false | false | true

### !a || b && c

a | b | c | !a | b && c | !a \ | \ | b && c
--- | --- | --- | --- | --- | --- | --- | ---
true | true | true | false | true | true
true | true | false | false | false | false
true | false | true | false | false | false
false | true | true | true | true | true
true | false | false | false | false | false
false | true | false | true | false | true
false | false | true | true | false | true
false | false | false | true | false | true

## Distributive Property of Logical Operators

The following statements are equivalent

`!(a && b)` is equivalent to `!a || !b`

Notice how when you distribute the `!` you have to flip the operand as well. `&&` becomes `||`

Same is true for the following example

`!(a || b)` is equivalent to `!a && !b`

`!(a || b && c)` is equivalent to `!a && (!b || !c)`

## Short Circuit Evaluation

In an `&&` (AND) statement, if the left side is `false`, there is no need to evaluate the right side. Since it's going to be false anyways!!

    false && true; // FALSE no matter what the right side is

In an `||` (OR) statement, if the left side is `true, there is no need to evaluate the right side. Since it's going to be true by default!!

    true || false; // TRUE no matter what the right side is

Java takes this shortcut by default for efficiency reasons