Ada短路控制形式

时间:2011-06-05 20:01:36

标签: ada abstract-syntax-tree short-circuiting

是什么意思

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?

4 个答案:

答案 0 :(得分: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 ZX 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

答案 1 :(得分:4)

短路运营商与其严格版本具有相同的优先权。

答案 2 :(得分:3)

作为Mrab&艾拉&垃圾已经说他们有相同的优势,但是没有指出明确是“然后”& “或者”运算符会在确定结果后立即返回表达式(完成评估)。

例如(伪代码):

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

大多数情况下,只会评估第一个函数(Almost_always_true_fn),而只有当返回false 时,才会被执行。

将其与:

进行比较
if Almost_always_true_fn() or costly_fn() then 
  do_stuff;
end if;

在这种情况下,将评估Almost_always_true_fn() expensive_fn()。

NWS。

答案 3 :(得分:3)

是的,在(x AND THEN y) AND z中,始终会评估relation z