Формы управления короткого замыкания 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?

Ответ 1

Операторы короткого замыкания имеют тот же приоритет, что и их строгие версии.

Ответ 2

В комментарии @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

Ответ 3

Поскольку 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.

Ответ 4

Да, в (x AND THEN y) AND z отношение z всегда будет оценено.