-
- [Presenter] How does the
computer evaluate expressions
-
with the logical operators and or and not?
-
To find out, let's explore
the order of operations
-
for compound Boolean expressions.
-
Imagine we're working
on a program to check
-
if a specific song matches the filters
-
for a specific playlist.
-
This expression asks, are
the song's beats per minute
-
both greater than or equal to 150,
-
and less than or equal to 180?
-
Logical operators like this and
-
come last in the order of operations.
-
So the computer evaluates the
two sides separately first.
-
Let's say the variable BPM
contains the value 200.
-
The comparison operators
greater than or equal to
-
and less than or equal to have
the same level of precedence,
-
so the computer evaluates left to right.
-
So we substitute in that 200
-
on the left-hand side first and simplify.
-
200 is greater than or equal to 150,
-
so this evaluates to true.
-
Then we jump to the right-hand side.
-
200 is not less than or equal to 180,
-
so this evaluates to false.
-
Now that we've simplified both sides down
-
to a Boolean value, we evaluate the and.
-
An expression with the and
operator only evaluates to true
-
if both sides are true.
-
So a true and a false evaluates to false.
-
And boom, the computer has its answer.
-
Let's try an expression
-
where there are multiple
logical operators.
-
This asks the question,
-
is the genre any of
the spellings of lo-fi?
-
Let's say the variable genre
contains the string lo-fi.
-
We evaluate the expressions around
-
the logical operators first
and then apply the ors.
-
We start with the leftmost expression.
-
These strings are not equal,
so this evaluates to false.
-
We jump to the second expression.
-
These strings are equal,
so this evaluates to true.
-
And then the third part,
these strings are not equal,
-
so this evaluates to false.
-
Now that we're all simplified,
we take a look at the ors.
-
An expression with the OR
operator evaluates to true
-
if at least one of the sides is true.
-
False or true evaluates to true and then
-
true or false evaluates to true.
-
Now you may be thinking,
-
"Whoa, whoa, did I even need
to evaluate that last part?"
-
Once I knew that second
expression evaluated to true,
-
I knew that my final answer
was going to be true.
-
As it's evaluating,
-
the computer makes the same optimization.
-
We called this short circuit
evaluation or lazy evaluation.
-
In its laziness, the
computer stops evaluating
-
as soon as it knows the final answer.
-
With the or operator the
computer stops evaluating
-
as soon as it finds a side
that evaluates to true
-
because no matter what's
on the other side,
-
the expression will
always evaluate to true.
-
True or true evaluates to true
-
and true or false also evaluates to true.
-
With the and operator
we have the opposite.
-
The computer stops as soon as it finds
-
a side that evaluates to false.
-
No matter what's on the other side
-
the whole expression
will evaluate to false.
-
Because false and true evaluates to false
-
and false and false
also evaluates to false.
-
Okay, so the computer's
saving itself some work.
-
Why do I care? Consider
this Boolean expression.
-
It looks pretty sensible,
-
but what if the variable group
size contains the value zero?
-
The computer can't divide by zero.
-
So this gives a runtime error.
-
Well, we could just not do that,
-
but we might not control
the value of group size.
-
Maybe it's set by user input.
-
To solve this, we can
check that group size
-
doesn't equal zero first.
-
If group size is equal to
zero, the left-hand side
-
will evaluate to false and the
computer will short circuit.
-
It'll jump to the conclusion
-
that the whole expression
must evaluate to false
-
and won't bother evaluating
the right-hand side,
-
thus avoiding the division by zero.
-
We can use this pattern
across our programs,
-
taking advantage of short
circuit evaluation to check
-
for preconditions that allow
us to avoid possible errors.
-
Last bit. What about the not operator?
-
The not operator takes precedence
-
over the and and or operators.
-
That means this expression really asks,
-
is the genre not equal to rock
-
and is the BPM greater than 130?
-
Now, we wanna be careful about
overusing the not operator
-
when we don't need to because it tends
-
to make things more confusing.
-
For example, this expression
is just equivalent
-
to genre not equals rock
and BPM greater than 130.
-
If instead I put parentheses here,
-
I would be negating the whole expression.
-
This asks, is it not both a
rock song and a fast song?
-
That's equivalent to the
expression is the genre
-
not equal to rock or is the
BPM less than or equal to 130?
-
If either of these conditions is true,
-
then this and expression
would evaluate to false,
-
which means not it would evaluate to true.
-
Now you're probably starting to understand
-
why I said to use the
not operator sparingly.
-
If you do need to negate a
compound Boolean expression,
-
it's often easier to understand
-
if you break it down into multiple parts.
-
Otherwise, the not operator
-
tends to make your program
a bit less readable.
-
Just like if I said something
like "I prefer not blue colors
-
or I'm going to not
not in this video now."