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 中?

4

4 回答 4

5

@oenone 的评论提到 GNAT 拒绝x AND THEN y AND z,但没有解释原因。从某种意义上说,这是真的,and并且and 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 Z, A and then B and then C) 中,但禁止混合它们。因此,问题中的表达式x AND THEN y AND z, 是非法的,甚至不会出现其含义的问题。这条规则的重点正是为了避免在这种情况下产生混淆。

你只需要写(X and then Y) and Zor 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
于 2011-08-02T15:47:39.793 回答
4

短路运算符的优先级与其严格版本相同。

于 2011-06-05T20:15:27.477 回答
3

是的,在 中(x AND THEN y) AND z关系 z将始终被评估。

于 2011-06-06T15:04:05.633 回答
3

正如 Mrab 和 Ira 和垃圾所说的那样,它们具有相同的 pecedence,但是没有明确指出的是,“然后”和“否则”运算符将导致表达式在结果可以返回时返回(完成评估)被确定。

例如(在伪代码中):

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() 都将被评估。

新创建的。

于 2011-06-06T08:39:44.257 回答