Ada短路控制形式

ada*_*LSE 10 ada abstract-syntax-tree short-circuiting

是什么意思

x AND THEN y AND z
Run Code Online (Sandbox Code Playgroud)

是吗

x AND THEN (y AND z)
Run Code Online (Sandbox Code Playgroud)

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

(x AND THEN y) AND z
Run Code Online (Sandbox Code Playgroud)

(如果x为FALSE,y被跳过,但可能是z被评估)在ada中?

Kei*_*son 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}
Run Code Online (Sandbox Code Playgroud)

其中{ 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
Run Code Online (Sandbox Code Playgroud)


MRA*_*RAB 4

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