Все ли языки программирования имеют логическую оценку короткого замыкания?

В PHP-коде

if(a() && b())

когда первый операнд оценивает значение false, b() не будет оцениваться.

Аналогично, в

if (a() || b())

когда первый операнд оценит true, b() не будет оценен..

Это верно для всех языков, таких как Java, С# и т.д.

Это тестовый код, который мы использовали.

<?php
function a(){
echo 'a';
return false;
}

function b(){
echo 'b';
return true;
}


if(a() && b()){
echo 'c';
}
?>

Ответ 1

Это называется оценка короткого замыкания.

Это правило справедливо для языков, полученных из C (C, С++, Java, С#), но не для всех языков.

Например, VB6 этого не делает, и это не было сделано в ранних версиях VB.NET. VB8 (в Visual Studio 2005) представил AndAlso и OrElse операторов для этой цели.

Кроме того, из комментариев кажется, что csh выполняет оценку короткого замыкания справа налево, чтобы еще более запутать ситуацию.

Следует также отметить, что оценка короткого замыкания (или отсутствие) имеет свои опасности, о которых следует знать. Например, если второй операнд - это функция, которая имеет какие-либо побочные эффекты, тогда код может работать не так, как планировал программист.

Ответ 2

Это не верно для VB6.

В VB.net вам нужно использовать "AndAlso" вместо "And", если вы хотите, чтобы он пропускал оценку второго выражения.

Ответ 3

Это верно для ВСЕХ языков, таких как JAVA, С# и т.д.?

В С# это справедливо только для операторов короткого замыкания "||" и "&&"; если вы просто используете '|' или '&', он будет оценивать обе стороны каждый раз.

Ответ 4

Он называется оценка короткого замыкания, и большинство языков это делает. В некоторых языках существуют операторы, которые этого не делают.

Ответ 5

Оригинальная версия Паскаля этого не сделала, что вызвало много горя. Современные Паскалы, такие как Delphi, работают так же, как C и др.

Ответ 6

Это верно для языков, которые являются "детьми" C: PHP, Java, С++, С#,... или в том же "вдохновении", что и Perl.

Но это не относится к VB (по крайней мере, до .NET, который для этого вводил новые ключевые слова).
(И это действительно беспокоит первое, что вы работаете с VB ^^)

Ответ 7

Ada имеет специальные короткозамкнутые формы условных выражений:

and then
or else

используется следующим образом:

if p.next /= null and then p.next.name = 'foo'
if x = 0 or else 1/x = y

В некотором смысле это выглядит неплохо, потому что вы можете сделать вывод, что программист знал, что выражение должно быть закорочено и что условное не работает случайно.

Ответ 8

Microsoft VBScript (часто используемый в сочетании с "Классическим" ASP) не имел оценки короткого замыкания для логических операторов, вместо этого он использует поразрядные оценка. Это одна из многих причин, по которой это возможно самый худший язык!

"Что происходит, так это то, что VBScript нелогично. VBScript побито. Все работают так называемые логические операторы по номерам, а не по логическим значениям! Не, И, Или, XOr, Eqv и Imp все конвертировать свои аргументы в четырехбайтовые целые числа, выполните логическую операцию на каждая пара битов в целых числах и верните результат. Если True равен -1 и False 0, тогда все получается, потому что -1 имеет все свои биты включен и 0 все его биты отключены. Но если туда попадут другие номера, все ставки отключены".

Взято из этого блога. Эрика Липперта.

Ответ 9

Это справедливо и для Java, но операторы | и т.д. будут оценивать обе стороны.

Ответ 10

В Delphi это опция компилятора.

Ответ 11

Это называется оценкой короткого замыкания, и она распространена для всех языков, на которых я когда-либо работал (C, С++, С#, Java, Smalltalk, Javascript, Lisp), за исключением VB, VB.NET и Fortran.

На самом деле это довольно полезная функция. Без короткого замыкания вы не сможете этого сделать:

if (a!= null & a.isBlank())

Без короткого замыкания вам придется иметь вложенные операторы if, потому что вторая часть будет вызывать ошибку, если a имеет значение null.

Ответ 12

Большинство языков (все, что я видел) используют оценку короткого замыкания для операторов CONDITIONAL, таких как && и ||. Они перестанут оценивать, как только одно из условий удовлетворит это требование. (Первое значение false on &. Первое истинное значение на ||)

Все операторы BINARY, такие как and и |, обрабатываются. (Original)

Все операторы BITWISE, такие как and и |, обрабатываются. (Редактирование: 5/10/17)

Ответ 13

В Erlang операторы and и or не проводят оценку короткого замыкания; вы должны использовать операторы orelse и andalso, если вы хотите короткое замыкание.

Ответ 14

Coldfusion будет проводить оценку короткого круга. Я уверен, что все разработчики CF написали:

<cfif isdefined("somevariable") and somevariable eq something>
//do logic
</cfif>

Ответ 15

MATLAB - это один язык, который различает "стандартные" логические операторы и операторов короткого замыкания:

  • & (Оператор И) и | (Оператор OR) может работать на массивах по-элементному.
  • && и || являются версиями короткого замыкания, для которых второй операнд оценивается только тогда, когда результат не полностью определяется первым операндом. Они могут работать только на скалярах, а не на массивах.

Ответ 16

В стандартном FORTRAN или Fortran операнды логического выражения могут быть оценены в любом порядке. Неполная оценка разрешена, но определенная реализация.

Это позволяет оптимизировать логические выражения, которые не были бы разрешены, если бы соблюдался строгий порядок слева направо. Выражения, требующие строгого упорядочения, должны быть разложены на отдельные условные обозначения или могут быть сделаны предположения, зависящие от реализации.

Поскольку для обеспечения упорядочения используется разложение, следует, что отдельные операторы IF не всегда могут быть оптимизированы в одно выражение. Однако оценка короткого замыкания является явной с декомпозицией, и это никогда не бывает хуже, чем языки, которые обеспечивают строгое упорядочение слева направо, чтобы дать ленивую оценку.

Языки, которые являются производными от FORTRAN (Fortran, BASIC, VBn) и языков, которые были разработаны для достижения эффективности, подобной FORTRAN (Pascal, Ada), первоначально соответствовали примеру FORTRAN, позволяющему оценивать вне порядка.

Ответ 17

Другие ответы дали хорошие примеры языков с оценкой короткого замыкания и без него, поэтому я не буду повторять их.

Только один интересный момент для добавления: Lisps, такие как Clojure, имеют логическую оценку короткого замыкания, но кроме того, вы можете тривиально определить любой оператор, который вам нравится, с оценкой короткого замыкания с помощью макросов.

Пример короткозамкнутой операции "nand" в Clojure:

(defmacro nand 
  ([x] 
    `(not ~x))
  ([x & xs] 
    `(let [nand# (not ~x)]
       (if nand# 
         true               ; short circuit if we can prove the nand is true
         (nand [email protected])))))    ; continue with the other expressions otherwise

(nand true true)
=> false

(nand false (println "Expression with a side effect!"))
=> true