Все ли языки программирования имеют логическую оценку короткого замыкания? - PullRequest
38 голосов
/ 05 августа 2009

В коде PHP

if(a() && b())

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

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

if (a() || b())

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

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

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

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

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


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

Ответы [ 17 ]

66 голосов
/ 05 августа 2009

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

Обычно это верно для языков, производных от C (C, C ++, Java, C #), но не для всех языков.

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

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

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

20 голосов
/ 05 августа 2009

Это не так для VB6.

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

14 голосов
/ 05 августа 2009

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

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

12 голосов
/ 05 августа 2009

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

8 голосов
/ 05 августа 2009

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

7 голосов
/ 05 августа 2009

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

and then
or else

используется так:

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

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

5 голосов
/ 05 августа 2009

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

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

4 голосов
/ 05 августа 2009

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

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

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

3 голосов
/ 05 августа 2009

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

2 голосов
/ 17 марта 2015

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

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

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

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

...