В чем смысл
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 оценивается) в ada?
В чем смысл
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 оценивается) в 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 и мусор сказали, что они имеют равную силу, однако явно не указано, что операторы ", а затем" и "или" приведут к тому, что выражение вернется (завершите оценку), как только результат может быть определен.
Например (в псевдокоде):
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
всегда будет оценено.