Все ли языки программирования имеют логическую оценку короткого замыкания? - 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 ]

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

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

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

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

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

Все операторы BITWISE, такие как & и |, обрабатываются. (Изменить: 5.10.17)

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

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

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

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

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

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

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

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

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

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

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

<cfif isdefined("somevariable") and somevariable eq something>
//do logic
</cfif>
0 голосов
/ 19 ноября 2011

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

Еще один интересный момент: Лиспы, такие как 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 ~@xs)))))    ; continue with the other expressions otherwise

(nand true true)
=> false

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