Вычисления по короткой схеме

Эта статья находится на начальном уровне проработки, в одной из её версий выборочно используется текст из источника, распространяемого под свободной лицензией
Материал из энциклопедии Руниверсалис
Стратегии вычисления
Строгие вычисления
Нестрогие вычисления
Недетерминированные стратегии
Другие

Вычисления по короткой схеме (англ. short-circuit evaluation), также известны как вычисления Маккарти (англ. McCarthy evaluation, в честь американского информатика Джона Маккарти) — это стратегия в некоторых языках программирования, при которой второй логический оператор выполняется или вычисляется только в том случае, если первого логического оператора недостаточно для определения значения выражения. Таким образом, после того, как результат выражения становится очевидным, его вычисление прекращается.

Примеры:

  • Если левый операнд AND имеет значение false, то общее значение выражения также false.
  • Если левый операнд OR имеет значение true, то общее значение выражения также true.

Более общо, в выражениях вида [math]\displaystyle{ p_1 \wedge p_2 \wedge p_3 \dots }[/math] либо [math]\displaystyle{ p_1 \vee p_2 \vee p_3 \dots }[/math] вычисление продолжается слева направо, пока одно из [math]\displaystyle{ p_n }[/math] не даст false или true соответственно. Наличие или отсутствие вычисления по короткой схеме особенно важно, если члены выражения — действия с возможными побочными эффектами (помимо вызова функций это может быть останов программы при делении на ноль или выход за пределы массива). Например, код вида if (n != 0) and (k/n > 17) ... является корректным только, если язык (или компилятор) гарантирует вычисление по короткой схеме.

В языках программирования с ленивыми вычислениями (Lisp, Perl, Haskell) логические операторы используются по короткой схеме. В других (Ada, Java, Delphi) доступны как операторы по короткой схеме, так и стандартные логические операторы. Для некоторых логических операций, таких как исключающее «или» (XOR), использование короткой схемы невозможно, потому что для определения результата всегда требуются оба операнда.

Ссылки