ADA 95教程 逻辑比较和优先级
什么是布尔变量?
Example program ------> e_c04_p1.ada
-- Chapter 4 - Program 1 with Ada.Text_IO; use Ada.Text_IO; procedure Compare is package Enum_IO is new Ada.Text_IO.Enumeration_IO(BOOLEAN); use Enum_IO; One : INTEGER := 1; Two : INTEGER := 2; Three : INTEGER := 3; Is_It : BOOLEAN := TRUE; -- initialized Which : BOOLEAN; -- uninitialized begin Which := TRUE; Put("Which now has the value of "); Put(Which); New_Line; Which := FALSE; Put("Which now has the value of "); Put(Which); New_Line; Is_It := (One + 1) = Two; Is_It := One /= Two; Is_It := One + Two >= Three; end Compare;
-- Result of execution -- Which now has the value of TRUE -- Which now has the value of FALSE
检查名为e_c04_p1.ada的程序,以获取逻辑比较的一个非常简单的示例。我们声明并初始化三个整型变量以供以后使用,然后在第14行和第15行声明两个布尔型BOOLEAN变量,第一个被初始化为TRUE。布尔型变量的赋值范围非常有限,即TRUE或FALSE,并且布尔型变量没有可用的数学运算。
在本教程的后面,我们将更多地介绍布尔型变量,但是为了在下一章学习程序控制,我们需要对布尔型变量有一个基本的了解。
第19行和第23行说明了如何为布尔变量赋值TRUE或FALSE。这些说明文字赋值的方式与将文字值赋值给整型变量的方式大致相同。因为我们希望显示布尔值,所以我们实例化了布尔类型的泛型包枚举IO的一个副本。同样,我们将在教程的后面部分研究这方面的细节。这个包可以在第21行和第25行输出布尔值。
布尔赋值语句
第28行到第30行更有趣,因为它们说明了如何将计算出的布尔值赋给布尔变量。在第28行中,整数变量One的值加上了1,并将总数与变量2中包含的值进行比较。表达式简化为1+1=2,由于1+1等于2,因此表达式的计算结果为TRUE,赋值给布尔变量Is_It。对于在其他编程语言中很少或没有使用布尔表达式经验的学生,下面将说明评估的各个步骤。
Is_It := (One + 1) = Two; Is_It := (1 + 1) = 2; Is_It := 2 = 2; Is_It := TRUE;
单个等号是表示相等的布尔运算符,如果要计算的两个表达式具有相同的值,则结果将为TRUE。如果它们的值不相同,则布尔结果将为FALSE。
还有其他布尔运算符吗?
有六个布尔运算符,所有六个将在下一个示例程序中说明。本程序的第29行说明了另一个不等式运算符的用法。此语句表示,如果1不等于2,则将TRUE的值赋给布尔变量is_It,否则将FALSE的值赋给布尔变量is_It。请注意,无论结果如何,都会为布尔变量指定一个值。最后,在第30行中使用了“大于或等于”运算符。
这是一个相当愚蠢的程序,因为没有使用任何结果,但它只是为了说明布尔变量是什么以及如何使用它。编译并运行此程序,然后继续下一个示例程序。
关于布尔求值的附加主题
Example program ------> e_c04_p2.ada
-- Chapter 4 - Program 2 with Ada.Text_IO, Ada.Integer_Text_IO; use Ada.Text_IO, Ada.Integer_Text_IO; procedure Compares is package Enum_IO is new Ada.Text_IO.Enumeration_IO(BOOLEAN); use Enum_IO; Index, Count : INTEGER := 12; Truth, Lies, Question : BOOLEAN; begin Truth := Index = Count; -- This is TRUE Lies := Index < Index; -- This is FALSE -- Examples of all BOOLEAN operators Question := Index = Count; -- Equality Question := Index /= Count; -- Inequality Question := Index < Count; -- Less than Question := Index <= Count; -- Less than or equal Question := Index > Count; -- Greater than Question := Index >= Count; -- Greater than or equal -- Examples of composite BOOLEAN expressions Question := Index = 12 and Count = 12 and Truth and TRUE; Question := Index /= 12 or FALSE or Count > 3 or Truth; Question := (Truth or Lies) and (Truth and not Lies); Question := Truth xor Lies; -- now for short circuit evaluation Question := Index /= Count and then Index = 9/(Index - Count); Question := Index = Count or else Index = 9/(Index - Count); Question := (Index = Count) or else (Index = 9/(Index - Count)); end Compares; -- Result of execution -- (No output generated by this program.)
检查名为e_c04_p2.ada的程序,您将看到所有六个布尔运算符都在使用中。我们在程序的声明部分定义了两个整型变量和三个布尔型变量,并在第14行和第15行中用一些比较示例开始了可执行部分。应该清楚的是,在第15行中,索引不能小于自身,所以结果是假的。
第18行到第23行说明了Ada中所有六个布尔运算符的用法,您理解这个列表应该不会有问题。
布尔与and运算符
第26到29行说明了使用保留字and、or、not和xor的复合布尔运算符。第26行的声明说
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.
使用Ada程序中可用的自由形式来编写前面的句子,可以帮助理解这个句子。要说明的一点是,您可以根据需要组合任意多个布尔表达式来完成特定的工作。
布尔或or运算符
使用Ada中可用的扩展自由形式,第27行中的语句表示
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.
布尔not运算符
第28行中的表达式说明了这两个运算符的用法,它们以稍微复杂的方式组合在一起,使用括号对表达式进行正确分组。这里出现了一个新的操作符,not简单地说,它颠倒了前面的布尔操作符的含义。
布尔异或xor运算符
第29行说明了“异或”运算符的用法,该运算符表示如果一个且只有一个操作数为真,则结果为真;如果两个操作数都为真,或两个操作数都为假,则结果为假。这种操作的一个很好的例子是在大厅两端都有开关的大厅灯。如果其中一个开关向上,则指示灯亮,但如果两个开关都向上或都向下,则指示灯熄灭。
布尔表达式的完全求值
按照在第26行到第29行中编写表达式的方式,在执行语句时将计算所有表达式。如果在第26行的情况下,Index的值不是12,那么不管其余的表达式是什么,最终结果都将是FALSE,对它们求值将是浪费时间。Ada将继续在整个行中盲目地计算所有表达式,并且浪费时间,因为它应该知道基于第一次比较的最终结果。然而,有一种方法可以告诉它,一旦知道最终答案就立即停止,通过使用短路操作器。
什么是“短路操作”?
如果你研究第32行,你会发现如果Index等于Count,我们将在表达式的第二部分用常数9除以0。通过将保留字then添加到and运算符,我们得到了一个短路操作,这意味着一旦系统知道最终结果,剩余的操作将被短路而不被评估。在本例中,如果Index等于Count,则第一项为FALSE,无需继续,因为第二项与FALSE进行and运算,无论第二项是什么,结果都为FALSE。在这种情况下,避免被零除。以相同的方式,第33行示出了通过添加保留字else而获得的短路或运算符。在这种情况下,如果Index等于Count,则无论第二项是什么,结果都是真的,因此不计算第二项并避免被零除。第34行与第33行相同,但说明了如何使用括号使逻辑更易于阅读。
应该清楚的是,Ada提供了执行任何布尔操作所需的工具。你要学会如何使用它们。
优先顺序
运算符的优先顺序如下所示。
** 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)
Ada 95参考手册(ARM)有一个完整的操作员列表和第4.5节中优先顺序的详细信息。如果对优先顺序有任何疑问,应将表达式与括号一起分组,因为它们具有绝对最高的优先顺序。你的程序的未来读者将确切地知道你的程序在做什么。
一定要编译并执行这个程序。请注意,我们还没有研究&、in和not-in运算符,但很快就会研究。
编程练习
1.将一些输出语句添加到两个示例程序中,以查看结果是否如预期的那样。这将给您使用布尔输出语句的经验 (Solution)
---------------------------------------------------------------------------------------------------------------------------
原英文版出处:https://perso.telecom-paristech.fr/pautet/Ada95/a95list.htm
翻译(百度):博客园 一个默默的 *** 的人