Considere el siguiente código:

var y = 4;
alert( y>1 || (y++ ===4)) 
alert(y);

Aquí, 'y' alerta 4. Pero en el siguiente código:

var y = 4;
alert( y>1 && (y++ ===4)) 
alert(y);

Aquí, alertas 'y' 5. Por qué && y || Los operadores muestran dos valores diferentes de 'y'?

0
user3760959 1 mar. 2018 a las 20:58

4 respuestas

La mejor respuesta

A medida que las expresiones lógicas se evalúan de izquierda a derecha, se prueban para una posible evaluación de "cortocircuito" utilizando las siguientes reglas:

falso && (cualquier cosa) se evalúa en cortocircuito como falso.

verdadero || (cualquier cosa) es un cortocircuito evaluado como verdadero.

Es decir, en el caso del operador || (or), la segunda condición no se verifica si primero se evalúa como verdadera, mientras que, en el caso del operador &&(and), la segunda condición no se verifica si primero se evalúa como falsa.

1
Sanchit Patiyal 1 mar. 2018 a las 18:01

La verdadera respuesta aquí es "porque omitir el procesamiento redundante hace que los programas se ejecuten más rápido".

Los diseñadores de compiladores / intérpretes siempre están buscando pequeñas optimizaciones como esta que harán que los programas en su idioma se ejecuten más rápido.

La lógica OR (||) se evalúa hasta que alcanza la primera condición true o hasta que encuentra que todas las condiciones fueron false. Una vez que OR alcanza la primera condición true, ninguna otra condición puede cambiar el hecho de que OR eventualmente se evaluará a true, entonces ¿por qué molestarse en ejecutarlas?

Por la misma razón, la lógica AND (&&) se evalúa hasta que alcanza la primera condición false (o descubre que todas las condiciones fueron true).

Los lenguajes que siempre ejecutan todas las condiciones en una secuencia lógica booleana son extremadamente poco comunes; debe esperar AND y OR actuar de esta manera en el próximo idioma que aprenda.

En su ejemplo, esto significa que el intérprete descubrió que y>1 en la prueba OR era verdadero, por lo que inmediatamente omitió el resto de las condiciones, incluido el postincremento (++). Se ejecutaron las primeras y segundas AND condiciones (porque la primera fue true, y AND solo se detiene en false).

Tenga en cuenta que si comienza con y = 1, entonces el OR incrementará y, pero su AND no .

Debe solicitar sus condiciones OR de modo que encuentre true lo más pronto posible, y sus condiciones AND deben ordenarse para encontrar false lo más pronto posible, donde "más pronto" significa cualquier ruta lógica te lleva a la respuesta con el menor procesamiento.

1
LinuxDisciple 1 mar. 2018 a las 19:02

En una declaración condicional OR, si la primera condición pasa, la condición posterior no se verifica, que es donde se incrementa el valor de y.

Y los condicionales funcionan a la inversa. Si la primera condición es falsa, entonces la condición posterior no se verificará.

No preguntaste al respecto, pero también vale la pena señalar que y++ === 4 Incrementará el valor de y después de que se compara con 4. Entonces, cuando se ejecuta la siguiente instrucción, el valor de y se ha incrementado a 5, aunque cuando se comparó con 4 fue 4 Si hubiera querido comparar el valor incrementado de y con 4, entonces el incremento se realiza primero ++y === 4. Esto aumentará y luego hará la comparación.

2
LavaWings 1 mar. 2018 a las 18:10

En el primer ejemplo, está atajando la ejecución:

y>1  // This is already true
||
(y++ ===4) // So this is not executed
2
lilezek 1 mar. 2018 a las 18:00