【问题标题】:Ada short-circuit control formsAda 短路控制形式
【发布时间】:2011-06-05 20:01:35
【问题描述】:

什么意思

x AND THEN y AND z

是吗

x AND THEN (y AND z)

(y, z 如果 x 为 FALSE,则永远不会被评估) 或

(x AND THEN y) AND z

(如果 x 为 FALSE,则跳过 y,但可能会评估 z) 在阿达?

【问题讨论】:

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

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


【解决方案1】:

@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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • AARM §4.5(17.a) 注意到详细的优先级“隐含在语法规则中”,在本例中为 §4.4 Expressions
    • 这并不能完全回答这个问题,因为“AND”和“AND THEN”具有相同的优先级,可以说可以在“同时”进行评估,或者假设 AND 是可交换的,在任意顺序。 鉴于相同的优先级,我认为规则是仅在对左侧的“... THEN”操作进行评估后才评估右侧的运算符,而这些运算尚未确定相同子项的结果优先级。
    • @Ira Baxter:我不关注。 §4.5(8) 继续说,对于“具有相同优先级的运算符,运算符按从左到右的文本顺序与其操作数相关联。”还需要什么?
    • @trashgod:海报说“同等优先”回答了 OP 的问题。我的观察是,您还需要某种从左到右的评估规则;你的 4.5(8) 显然是章节和诗句。我对它的描述有点松散。您希望编译器以任何顺序评估尽可能多的 AND 子项以生成最佳代码,但您必须从左到右评估 AND THEN 项。
    • @Ira Baxter:啊,谢谢你的澄清。不久前我追过这个,我记得需要两个部分。我认为我们意见一致。
    【解决方案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() 都将被评估。

    新世界新闻。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2018-01-06
        • 2015-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多