26

I'm learning Ada by fixing bugs and reading code. I've noticed some if statements that are ganged with "and" and others with "and then". similarly, there is "or" and other places there is "or else". A co-worker says it's just syntactic sugar and makes no difference. I wonder if he's right?

4

4 回答 4

35

在 Ada中and thenor else是所谓的“短路”形式,相应地andor运算符:

快捷操作符 [ and then, or else] 用于使布尔表达式部分的计算成为有条件的。永远不应该这样做以加快评估速度(使用现代优化编译器,它可能不会产生这种效果)。正确的用法是防止对已知引发异常的表达式求值。

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

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

只有当Dog 不为空时,才会评估 G (Dog) 。如果没有and then它,无论如何都会被评估,如果 Dog 确实为空,则会引发异常。

请注意,严格来说, and thenandor else不是运算符,因为它们不能被重载。

我建议阅读这本wikibook,它将极大地帮助您完成 Ada 之旅。)

于 2013-06-10T15:05:37.280 回答
3

假设 FuncB 是一个返回具有副作用的布尔值的函数。在

if False and FuncB then
   null;
end if;

FuncB 的副作用发生,而短路形式

if False and then FuncB then
    null;
end if;

FuncB 的副作用不会发生。

于 2013-06-12T12:10:28.730 回答
3

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;

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

于 2013-06-20T17:58:18.883 回答
-1

if (i=0) AndAlso (Func()) 那么

  • 如果您尝试在 VBScript 中进行短路,请使用它
于 2021-11-07T02:10:13.383 回答