の意味は何ですか
x AND THEN y AND z
それは...ですか
x AND THEN (y AND z)
(y、xがFALSEの場合、zは評価されません)または
(x AND THEN y) AND z
(xがFALSEの場合、yはスキップされますが、zが評価される可能性があります)。
の意味は何ですか
x AND THEN y AND z
それは...ですか
x AND THEN (y AND z)
(y、xがFALSEの場合、zは評価されません)または
(x AND THEN y) AND z
(xがFALSEの場合、yはスキップされますが、zが評価される可能性があります)。
@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 }
は0回以上の出現を示しますFOO
。
この文法は、これらの演算子または制御フォームのいずれかを1つの式(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」&「orelse」演算子は結果ができるとすぐに式を返す(終了評価)ということです決定されます。
例(擬似コード):
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()の両方が評価されます。
NWS。
はい、(x AND THEN y) AND z
では、関係 z
は常に評価されます。