Есть ли разница между "и" vs ", а затем" в выражении IF
Я изучаю Ada, исправляя ошибки и код чтения. Я заметил некоторые утверждения if, которые связаны с "и", а другие - с "и затем". аналогично, есть "или" и другие места, где есть "или еще". Сотрудник говорит, что это просто синтаксический сахар и не имеет никакого значения. Интересно, правильно ли он?
Ответы
Ответ 1
В Ada and then
и or else
представлены так называемые "короткозамкнутые" формы операторов and
и or
:
Операторы ярлыков [ and then
, or else
] используются для того, чтобы оценка частей булевых выражений была условной. Это никогда не должно быть сделано для ускорения оценки (с помощью современных оптимизирующих компиляторов он будет возможно, не имеет такого эффекта). Правильное использование - предотвращение оценка выражений, которые, как известно, создают исключение.
Пример (взято, как объяснение выше, из wikibooks/Ada):
if Dog /= null and then G (Dog) then
Walk (Dog);
end if;
Здесь G (Dog) будет оцениваться только в том случае, если Dog не равен null. Без and then
он будет оцениваться в любом случае, создавая исключение, если собака действительно имеет значение null.
Обратите внимание, что and then
и or else
, строго говоря, не являются операторами, поскольку они не могут быть перегружены.
Я бы предложил прочитать этот wikibook, это очень поможет вам в вашем путешествии через Аду. )
Ответ 2
Предположим, что FuncB является функцией, возвращающей Boolean, которая имеет побочный эффект. В
if False and FuncB then
null;
end if;
возникает побочный эффект FuncB, а с формой короткого замыкания
if False and then FuncB then
null;
end if;
побочный эффект FuncB не возникает.
Ответ 3
Конструкция and then
является характеристикой, которую некоторые языки программирования используют в качестве короткого замыкания.
Вы можете протестировать и понять эту функциональность, попробовав эти фрагменты кода:
x:=0;
if false and 1/x=1 then
null;
end if;
Это приведет к делению на нулевое исключение.
x:=0;
if false and then 1/x=0 then
null;
end if;
Это не вызовет исключения, поскольку не проверяет второе условие.