什么是它的含义?
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中是这样的吗?什么是它的含义?
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中是这样的吗?@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 Z
或者 X and then (Y and Z)
,取决于你想要做什么。
同样适用于混合使用and
和or
:
X and Y and Z -- legal
X and Y or Z -- ILLEGAL
(X and Y) or Z -- legal
X and (Y or Z) -- legal
正如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;