在IF语句中,“and”和“and then”有什么区别吗?

26

我正在通过修复bug和阅读代码来学习Ada。我注意到有些if语句使用"and"连接,而其他的则使用"and then"。同样地,有一些地方使用了"or",而其他地方则使用了"or else"。我的同事说这只是一种语法糖,并没有什么区别。我想知道他是否正确?


5
不需要太多解释,简短的回答是“不!” - Simon Wright
2
“and then”和“or else”表达式的语义有所不同,因为它们是惰性求值的。 - darkestkhan
你同事的评价相当懒惰。 - TamaMcGlinn
4个回答

36

在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”,它将被无论如何评估,如果确实为空,则会引发异常。
请注意,“and then”和“or else”严格来说不是运算符,因为它们无法重载。
我建议阅读这本wikibook,它将极大地帮助您在 Ada 中的旅程中。

1
请提供维基百科书链接,这是一个非常有用的资源。 - erict

4
假设 FuncB 是一个返回布尔值且具有副作用的函数。在...
if False and FuncB then
   null;
end if;

当使用短路形式时,FuncB会产生副作用。

if False and then FuncB then
    null;
end if;

FuncB没有产生副作用。


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;

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

false and [then] 1/x会导致编译时错误,因为1/x不是Boolean类型。 - Keith Thompson

-1

如果 (i=0) AndAlso (Func()) then

  • 如果你在 VBScript 中尝试短路,请使用此方法

目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接