IF语句中“和”与“然后”之间是否存在差异

时间:2013-06-10 15:02:14

标签: ada

我正在通过修复错误和阅读代码来学习Ada。我注意到一些if语句与“and”结合,其他语句与“然后”结合。类似地,有“或”和其他地方有“或其他”。一位同事说这只是语法糖并没有区别。我不知道他是不对的?

3 个答案:

答案 0 :(得分:23)

Ada and thenor else是所谓的“短路”形式,相应地是andor运营商:

  

快捷键操作符[and thenor else]用于评估布尔表达式的部分条件。永远不应该这样做   加快评估速度(使用现代优化编译器,它会   可能没有那种效果)。正确的用法是防止   评估已知引起异常的表达。

示例(如上所述,来自wikibooks/Ada):

if Dog /= null and then G (Dog) then
   Walk (Dog);
end if;

仅当 Dog不为空时,才会对评估G(Dog)。如果没有and then,它将被评估,如果Dog确实为null,则会引发异常。

请注意,and thenor 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;

这个不会引发异常,因为它不会检查第二个条件。