我正在通过修复错误和阅读代码来学习Ada。我注意到一些if语句与“and”结合,其他语句与“然后”结合。类似地,有“或”和其他地方有“或其他”。一位同事说这只是语法糖并没有区别。我不知道他是不对的?
答案 0 :(得分:23)
Ada and then
和or else
是所谓的“短路”形式,相应地是and
和or
运营商:
快捷键操作符[
and then
,or else
]用于评估布尔表达式的部分条件。永远不应该这样做 加快评估速度(使用现代优化编译器,它会 可能没有那种效果)。正确的用法是防止 评估已知引起异常的表达。
示例(如上所述,来自wikibooks/Ada):
if Dog /= null and then G (Dog) then
Walk (Dog);
end if;
仅当 Dog不为空时,才会对评估G(Dog)。如果没有and then
,它将被评估,如果Dog确实为null,则会引发异常。
请注意,and then
和or else
严格来说不是运算符,因为它们不能超载。
我建议您阅读此wikibook,这将极大地帮助您完成Ada之旅。 )
答案 1 :(得分:2)
假设FuncB是一个返回布尔值的函数,它有副作用。在
if False and FuncB then
null;
end if;
FuncB的副作用发生,而短路形式
if False and then FuncB then
null;
end if;
不会发生FuncB的副作用。
答案 2 :(得分:2)
and then
构造是一些编程语言使用的特征,称为短路。
您可以尝试以下代码段来测试和了解此功能:
x:=0;
if false and 1/x=1 then
null;
end if;
这个将导致除以零的异常。
x:=0;
if false and then 1/x=0 then
null;
end if;
这个不会引发异常,因为它不会检查第二个条件。