Ada短路控制形式

10

什么是它的含义?

x AND THEN y AND z

它是什么

x AND THEN (y AND z)

当 x 为 FALSE 时,y 和 z 不会被计算

(x AND THEN y) AND z
(如果 x 是 FALSE,则跳过 y,但有可能会计算 z)在Ada中是这样的吗?

3
GNAT将拒绝编译第一个示例,并显示错误消息“表达式中混合逻辑运算符”。 - Rommudoh
4个回答

5

@oenone的评论提到GNAT拒绝x AND THEN y AND z,但没有解释原因。在某种意义上,andand then具有相同的优先级,但这并不是全部内容。

表达式的语法如下:

expression ::=
  relation {and relation}  | relation {and then relation}
  | relation {or relation} | relation {or else relation}
  | relation {xor relation}

其中{ FOO }表示零个或多个FOO

这个语法专门设计用于允许任何一个这些运算符或控制形式在单个表达式中链接(X and Y and ZA and then B and then C),但禁止混合使用它们。因此,问题中的表达式x AND THEN y AND z是不合法的,甚至不会引起它的含义是什么的问题。这个规则的目的正是避免在这种情况下的混淆。

你只需要写成(X and then Y) and Z 或者 X and then (Y and Z),取决于你想要做什么。

同样适用于混合使用andor

    X and Y and Z  -- legal
    X and Y or  Z  -- ILLEGAL
    (X and Y) or Z -- legal
    X and (Y or Z) -- legal

4
短路运算符与它们的严格版本具有相同的优先级。

1
AARM §4.5(17.a)指出,详细的优先级在语法规则中是“隐含的”,在这种情况下,参考§4.4表达式 - trashgod
这并没有完全回答问题,因为“AND”和“AND THEN”具有相同的优先级,并且可以在“同时”评估,或者考虑到AND是可交换的,以任意顺序进行评估。假设具有相同的优先级,我认为规则是右侧的运算符仅在左侧的“...THEN”操作已经被评估并且未确定相同优先级子项的结果之后才会被评估。 - Ira Baxter
1
@Ira Baxter:我不明白。§4.5(8) 继续说道,“对于同一优先级的运算符,运算符按从左到右的文本顺序与其操作数相关联。” 还需要什么? - trashgod
@trashgod:Poster说“相等的优先级”,回答了OP的问题。我的观察是,除此之外,你需要某种从左到右的评估规则;你的4.5(8)显然是经过详细阐述的。我稍微宽泛地描述了一下;你希望编译器按任意顺序评估尽可能多的AND子项以生成最佳代码,但必须从左到右评估AND THEN项。 - Ira Baxter
@Ira Baxter:啊,谢谢澄清。我不久前也追查过这个问题,记得需要两个部分。我想我们是达成一致意见的。 - trashgod

3

(x AND THEN y) AND z 中,关系 z 总是会被评估。


3

正如Mrab、Ira和trash所说,它们具有相等的优先级。然而,还没有明确指出的是,“and then”和“or else”运算符将会在可以确定结果时使表达式返回(完成评估)。

例如(伪代码):

if Almost_always_true_fn() or else costly_fn() then 
  do_stuff;
end if;

大部分时间只有第一个函数(Almost_always_true_fn)会被执行,只有在它返回false时才会执行costly_fn,这样可以节约时间。

与此相比:

if Almost_always_true_fn() or costly_fn() then 
  do_stuff;
end if;

在这种情况下,Almost_always_true_fn()和costly_fn()都会被评估。
NWS.

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