


                                                        Chapter 4
                                  LOGICAL COMPARES AND PRECEDENCE


WHAT IS A BOOLEAN VARIABLE?
_________________________________________________________________

Examine the program named COMPARE.ADA for an      ===============
example of logical compares being used in a very    COMPARE.ADA
trivial way.  We declare and initialize three     ===============
INTEGER type variables for use later then
declare two variables of type BOOLEAN in lines
14 and 15, with the first one being initialized to TRUE.  A BOOLEAN
type variable has a very limited range of values which can be
assigned to it, namely TRUE or FALSE, and there are no mathematical
operations available for use on variables of type BOOLEAN.

Much more will be said about the BOOLEAN type variable later in
this tutorial, but we need a basic understanding of a boolean
variable in order to study program control in the next chapter.

Lines 19 and 23 illustrate how you can assign a value of either
TRUE or FALSE to a BOOLEAN variable.  These illustrate literal
assignment in much the same way that a literal value can be
assigned to an INTEGER type variable.  Because we wish to display
BOOLEAN values, we instantiate a copy of the generic package
Enumeration_IO for the BOOLEAN type.  Once again, we will study the
details of this later in the tutorial.  This package makes it
possible to output BOOLEAN values in lines 21 and 25.



BOOLEAN ASSIGNMENT STATEMENTS
_________________________________________________________________

Lines 28 through 30 are a bit more interesting because they
illustrate assigning a calculated BOOLEAN value to a BOOLEAN
variable.  In line 28, the value of the INTEGER variable One has
the literal 1 added to it and the total is compared to the value
contained in the variable Two.  The expression reduces to the
expression 1 + 1 = 2, and since 1 + 1 is equal to 2, the expression
evaluates to TRUE which is assigned to the BOOLEAN variable Is_It.
The various steps in evaluation are illustrated below for the
student with little or no experience using BOOLEAN expressions in
some other programming language.

     Is_It := (One + 1) = Two;
     Is_It := (1   + 1) = 2;
     Is_It := 2 = 2;
     Is_It := TRUE;

The single equal sign is the BOOLEAN operator for equality, and if
the two expressions being evaluated are of the same value, a value

                                                         Page 4-1

                      Chapter 4 - Logical Compares and Precedence

of TRUE will result.  If they are not of the same value, the
BOOLEAN result will be FALSE.


ARE THERE OTHER BOOLEAN OPERATORS?
_________________________________________________________________

There are a total of six BOOLEAN operators, and all six will be
illustrated in the next example program.  Line 29 in the present
program illustrates use of one of the others, the inequality
operator.  This statement says, if One is not equal to Two then
assign the value of TRUE to the BOOLEAN variable Is_It, otherwise
assign a value of FALSE to the BOOLEAN variable Is_It.  Note that
regardless of the result, a value will be assigned to the BOOLEAN
variable.  Finally, the "greater than or equal" operator is
illustrated in use in line 30.  This is a rather silly program
since none of the results are used, but it is meant to illustrate
just what a BOOLEAN variable is and how to use it.  Compile and run
this program before continuing on to the next example program.



ADDITIONAL TOPICS ON BOOLEAN EVALUATION
_________________________________________________________________

Examine the program named COMPARES.ADA and you   ================
will see all six BOOLEAN operators in use.  We     COMPARES.ADA
define two INTEGER and three BOOLEAN type        ================
variables in the declaration part of the
program, and begin the executable part with some
compare examples in lines 17 and 18.  It should be clear that in
line 18, Index can not be less than itself, so the result is FALSE.

Lines 21 through 26 illustrate the use of all six BOOLEAN operators
which are available in Ada and you should have no trouble
understanding this list.



THE BOOLEAN and OPERATOR
_________________________________________________________________

Lines 29 through 32 illustrate composite BOOLEAN operators using
the reserved words and, or, not, and xor.  The statement in line
29 says that

         if Index = 12
     and if Count = 12
     and if Truth currently has the value TRUE
     and if TRUE    (which is always TRUE)
            then assign TRUE to Question
            otherwise assign FALSE to Question.



                                                         Page 4-2

                      Chapter 4 - Logical Compares and Precedence

Using the freeform available in an Ada program to write the
previous sentence, can help in understanding the sentence.  The
point to be illustrated is that you can combine as many BOOLEAN
expressions as you desire to do a particular job.



THE BOOLEAN or OPERATOR
_________________________________________________________________

Using the expanded freeform available in Ada, the statement in line
30 says that

           if Index is not equal to 12
        or if FALSE    (which is always FALSE)
        or if Count is greater than 3
        or if Truth currently has the value of TRUE
              then assign TRUE to Question
              otherwise assign FALSE to Question.



THE BOOLEAN not OPERATOR
_________________________________________________________________

The expression in line 31 illustrates the use of these two
operators combined in a slightly more complex way using parentheses
to properly group the expressions.  A new operator appears here,
the not which simply says to reverse the meaning of the BOOLEAN
operator which it precedes.



THE BOOLEAN xor OPERATOR
_________________________________________________________________

Line 32 illustrates the use of the "exclusive or" operator which
says that the result will be TRUE if one and only one of the
operands are TRUE, and FALSE if both operands are TRUE, or both
operands are FALSE.  A good illustration of this operation would
be a hall light with a switch at both ends of the hall.  If one of
the switches is up, the light is on, but if both are up or both are
down, the light is off.



FULL EVALUATION OF BOOLEAN EXPRESSIONS
_________________________________________________________________

The way the expressions are written in lines 29 through 32, all of
the expressions will be evaluated when the statement is executed.
If, in the case of line 29, the value of Index is not 12, then the
final result will be FALSE no matter what the rest of the
expressions are and it would be a waste of time to evaluate them.

                                                         Page 4-3

                      Chapter 4 - Logical Compares and Precedence

Ada will continue blindly across the entire line evaluating all of
the expressions and wasting time since it should know the final
result based on the first comparison.  There is a way to tell it
to stop as soon as it knows the final answer, through use of the
short circuit operators.



WHAT ARE "SHORT CIRCUIT OPERATORS"?
_________________________________________________________________

If you study line 35, you will see that if Index is equal to Count,
we will be dividing the constant 9 by zero in the second part of
the expression.  By adding the reserved word then to the and
operator we have a short circuit operation, which means as soon as
the system knows the final outcome, the remaining operations are
short circuited and not executed.  In the present example, if Index
is equal to Count, the first term is FALSE and there is no need to
continue since the second term is to be anded with the FALSE
resulting in FALSE no matter what the second term is.  Division by
zero is avoided in this case because the division is not attempted.

In the same manner, line 36 illustrates the short circuit or
operator which is obtained by adding the reserved word else.  In
this case, if Index is equal to Count, the result will be TRUE
regardless of what the second term is, so the second term is not
evaluated and division by zero is avoided.  Line 37 is identical
to line 36 but illustrates the use of parentheses to make the logic
a little easier to read.



ORDER OF PRECEDENCE
_________________________________________________________________

The order of precedence of operators is given by the following
list.

     **   not  abs        -- Highest precedence
     *    /    mod  rem   -- Multiplying operators
     +    -               -- Unary operators
     +    -    &          -- Binary adding operators
     =    /=   <          -- Relational operators
     <=   >    >=         -- Relational operators
     in   not in          -- (same precedence)
     and  or  xor         -- Logical operators
     and  then  or else   -- (same precedence)

The LRM has a complete list of the operators and the details of the
order of precedence in section 4.5.  If there is any question as
to the order of precedence, you should group expressions together
with parentheses since they have the absolute highest precedence.
A future reader of your program will know exactly what your program
is doing.

                                                         Page 4-4

                      Chapter 4 - Logical Compares and Precedence


Be sure to compile and execute this program.  Note that we have not
yet studied the &, the in, and the not in operators but will soon.



PROGRAMMING EXERCISE
_________________________________________________________________

1.   Add some output statements to both example programs to see
     that the results are as predicted.  This will give you
     experience using the boolean output statement.










































                                                         Page 4-5