script operator assignment language-agnostic if-statement short-circuiting

language agnostic - operator - ¿Todos los lenguajes de programación tienen una evaluación booleana de cortocircuito?



js var || (17)

En el código PHP

if(a() && b())

cuando el primer operando se evalúa como false , b() no será evaluado.

Del mismo modo, en

if (a() || b())

cuando el primer operando se evalúa como true , b() no será evaluado ..

¿Es esto cierto para todos los idiomas, como Java, C #, etc.?

Este es el código de prueba que usamos.

<?php function a(){ echo ''a''; return false; } function b(){ echo ''b''; return true; } if(a() && b()){ echo ''c''; } ?>


¿Es esto cierto para TODOS los idiomas, como JAVA, C #, etc.?

En C # esto solo es cierto para los operadores en cortocircuito '' || ''y'' && ''; si solo usas '' | ''o'' & ''evaluará ambos lados cada vez.


Ada tiene formas especiales de cortocircuitos condicionales:

and then or else

usado así:

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

En cierto modo, es agradable porque se puede deducir que el programador sabía que la expresión necesitaba un cortocircuito y que el condicional no funcionaba por accidente.


Coldfusion realizará de forma nativa una evaluación de corto circuito. Estoy seguro de que todos los desarrolladores de CF han escrito:

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


En Delphi es una opción de compilación.


En Erlang, los operadores "y" or y" no realizan una evaluación de cortocircuito; debe usar operadores orelse y orelse si desea un comportamiento de cortocircuito.


En FORTRAN estándar o Fortran, los operandos de una expresión booleana se pueden evaluar en cualquier orden. Se permite una evaluación incompleta, pero se definió la implementación.

Esto permite la optimización de expresiones booleanas que no estarían permitidas si se aplica un estricto orden de izquierda a derecha. Las expresiones que requieren un orden estricto deben descomponerse en condicionales separados, o pueden hacerse suposiciones dependientes de la implementación.

Como la descomposición se usa para forzar el orden, se deduce que las declaraciones IF separadas no siempre se pueden optimizar en una sola expresión. Sin embargo, la evaluación de cortocircuito es explícita con la descomposición, y esto nunca es peor que los lenguajes que imponen un ordenamiento estricto de izquierda a derecha para permitir la evaluación diferida.

Los lenguajes que se derivan de FORTRAN (Fortran, BASIC, VBn) y los lenguajes que se diseñaron para lograr la eficiencia similar a FORTRAN (Pascal, Ada) siguieron inicialmente el ejemplo de FORTRAN de permitir la evaluación fuera de orden.


Es cierto para los lenguajes que son "niños" de C: PHP, Java, C ++, C #, ... o en la misma "inspiración", como Perl.

Pero no es cierto para VB (al menos antes de .NET, que introdujo nuevas palabras clave para eso).
(Y eso es realmente perturbador cuando trabajas con VB ^^)


Esto se denomina evaluación de cortocircuito y es común para todos los idiomas en los que he trabajado (C, C ++, C #, Java, Smalltalk, Javascript, Lisp), excepto para VB, VB.NET y Fortran.

En realidad, es una característica bastante útil. Sin cortocircuitos, no podrías hacer esto:

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

Sin cortocircuito, tendría que haber anidado declaraciones if porque la segunda parte arrojaría un error si a fuera nulo.


Esto se llama evaluación de cortocircuito .

En general, es cierto para los lenguajes derivados de C (C, C ++, Java, C #) pero no verdadero para todos los idiomas.

Por ejemplo, VB6 no hace esto, ni se hizo en versiones anteriores de VB.NET. VB8 (en Visual Studio 2005) introdujo los operadores AndAlso y OrElse para este propósito.

Además, a partir de los comentarios, parece que csh realiza la evaluación de cortocircuito de derecha a izquierda, para hacer las cosas aún más confusas.

También se debe señalar que la evaluación de cortocircuito (o la falta de) tiene sus peligros a tener en cuenta. Por ejemplo, si el segundo operando es una función que tiene algún efecto secundario, entonces el código puede no funcionar exactamente como lo pretendía el programador.


Esto también se aplica a Java, pero los operadores |, & etc evaluarán ambos lados.


La mayoría de los idiomas (todo lo que he visto) utilizan la evaluación de cortocircuito en operadores CONDICIONALES como && y ||. Dejarán de evaluar tan pronto como una de las condiciones satisfaga el requisito. (El primer falso en &&. El primer verdadero en ||)

Todos los operadores BINARY, como & y |, se procesan. (Original)

Todos los operadores BITWISE como & y |, se procesan. (Editar: 5/10/17)


La versión original de Pascal no lo hizo, lo que causó mucha pena. Pascales modernos, como Delphi funcionan de la misma manera que C et al.


MATLAB es un lenguaje que distingue entre operadores lógicos "estándar" y operadores de cortocircuito :

  • & (Operador Y) y | (Operador OR) puede operar en arreglos en forma de elemento.
  • && y || son versiones de cortocircuito para las cuales el segundo operando se evalúa solo cuando el resultado no está completamente determinado por el primer operando. Estos solo pueden operar en escalares , no en arreglos.

No es cierto para VB6.

En VB.net debes usar "AndAlso" en lugar de "Y" si quieres que se saltee la evaluación de la segunda expresión.


Otras respuestas han dado buenos ejemplos de idiomas con y sin evaluación de cortocircuitos, así que no los repetiré.

Solo un punto interesante para agregar: Lisps como Clojure tienen una evaluación booleana de cortocircuitos, pero además puedes definir trivialmente cualquier operador que desees con la evaluación de cortocircuitos mediante el uso de macros.

Ejemplo de una operación "nand" de cortocircuito en 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



Microsoft VBScript (a menudo utilizado junto con ASP ''clásico'') no tenía evaluación de cortocircuito para operadores booleanos, en cambio utiliza evaluación bit a bit. ¡Cuál es una de las muchas razones por las cuales es posiblemente el peor lenguaje de todos los tiempos!

"Lo que sucede es que VBScript no es lógico. VBScript es en modo bit. Todos los llamados operadores lógicos trabajan en números, ¡no en valores booleanos! No, Y, O, XOr, Eqv e Imp todos convierten sus argumentos en cuatro bytes enteros, haga la operación lógica en cada par de bits en los enteros, y devuelva el resultado. Si True es -1 y False es 0, entonces todo funciona, porque -1 tiene todos sus bits activados y 0 tiene todos sus bits activados off. Pero si entran otros números, todas las apuestas están apagadas ".

Tomado de este blog. por Eric Lippert.