Ада формы контроля короткого замыкания - PullRequest
10 голосов
/ 06 июня 2011

Что означает

x AND THEN y AND z

, это

x AND THEN (y AND z)

(у, z никогда не вычисляется, если х ЛОЖЬ) или

(x AND THEN y) AND z

(если x равен FALSE, y пропускается, но возможно, что z вычисляется) в ada?

Ответы [ 4 ]

5 голосов
/ 02 августа 2011

@ В комментарии 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
4 голосов
/ 06 июня 2011

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

3 голосов
/ 06 июня 2011

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

3 голосов
/ 06 июня 2011

Как сказали Мраб, Ира, и trash, они имеют одинаковую склонность, однако то, что не было указано явно , заключается в том, что операторы «и затем» & или «иначе» вызовут выражение для возврата ( завершить оценку), как только будет определен результат.

Например (в псевдокоде):

if Almost_always_true_fn() or else costly_fn() then 
  do_stuff;
end if;

В большинстве случаев будет оцениваться только первая функция (почти_always_true_fn), и только когда возвращается false будет выполняться costly_fn.

Сравните это с:

if Almost_always_true_fn() or costly_fn() then 
  do_stuff;
end if;

В этом случае будут оцениваться как Near_always_true_fn () , так и costly_fn ().

NWS.

...