LOGICAL COMPARES AND PRECEDENCE
WHAT IS A BOOLEAN VARIABLE?
Example program ------> e_c04_p1.ada
Examine the program named e_c04_p1.ada for an example of logical compares being used in a very 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 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 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
Example program ------> e_c04_p2.ada
Examine the program named e_c04_p2.ada and you will see all six BOOLEAN operators in use. We 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 14 and 15. It should be clear that in line 15, Index can not be less than itself, so the result is FALSE.
Lines 18 through 23 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 26 through 29 illustrate composite BOOLEAN operators using the reserved words and, or, not, and xor. The statement in line 26 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.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 27 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 28 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 29 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 26 through 29, all of the expressions will be evaluated when the statement is executed. If, in the case of line 26, 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. 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 however, 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 32, 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 evaluated. 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 33 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 34 is identical to line 33 but illustrates the use of parentheses to make the logic a little easier to read.
It should be clear that Ada provides the tools needed to do any boolean operation needed. It is up to you to learn how to use them.
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 Ada 95 Reference Manual (ARM) 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.
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.
Return to the Table of Contents