Рассмотрим следующий код:

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

Здесь 'y' оповещения 4. Но в следующем коде:

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

Здесь «y» оповещает 5. Почему && и || операторы показывают два разных значения 'у'?

0
user3760959 1 Мар 2018 в 20:58

4 ответа

Лучший ответ

Поскольку логические выражения оцениваются слева направо, они проверяются на возможную оценку "короткого замыкания" с использованием следующих правил:

false && (что угодно) - короткое замыкание, оцененное как false.

правда || (что-нибудь) - короткое замыкание, оцененное как истинное.

То есть в случае оператора || (or) второе условие не проверяется, если первое значение равно true, тогда как, как в случае оператора &&(and), второе условие не проверяется, если первое значение равно false.

1
Sanchit Patiyal 1 Мар 2018 в 18:01

Реальный ответ здесь - «потому что пропуск избыточной обработки заставляет программы работать быстрее».

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

Логический OR (||) оценивает, пока не достигнет первого true условия или пока не обнаружит, что все условия были false. Как только OR достигнет первого условия true, никакие другие условия не могут изменить тот факт, что OR в конечном итоге оценивается как true, так зачем их выполнять?

По той же причине логический AND (&&) оценивает, пока не достигнет первого false условия (или не обнаружит, что все условия были true).

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

В вашем примере это означает, что интерпретатор обнаружил, что y>1 в тесте OR был верным, поэтому он сразу пропустил остальные условия, включая постинкремент (++). Первые условия и second AND были выполнены (поскольку первым было true, а AND останавливается только на false).

Обратите внимание, что если вы начнете с y = 1, то OR будет увеличивать y, но ваш AND не будет ,

Вы должны упорядочить свои OR условия так, чтобы они быстрее находили true, а ваши AND условия должны быть приказаны найти false как можно скорее, где "скорей" означает любой логический путь дает вам ответ с наименьшей обработкой.

1
LinuxDisciple 1 Мар 2018 в 19:02

В условном операторе ИЛИ, если первое условие выполнено, последующее условие не проверяется, где значение y увеличивается.

И условные выражения работают в обратном порядке. Если первое условие ложно, то последующее условие не будет проверено.

Вы не спрашивали об этом, но также стоит отметить, что {{Х0}} Увеличивает значение y после того, как сравнивается с 4. Итак, когда выполняется следующий оператор, значение y увеличивается до 5, хотя при сравнении с 4 оно равно 4 Если вы хотели сравнить увеличенное значение y с 4, то сначала выполняется увеличение ++y === 4. Это увеличит значение, и затем выполнит сравнение.

2
LavaWings 1 Мар 2018 в 18:10

В первом примере вы сокращаете выполнение:

y>1  // This is already true
||
(y++ ===4) // So this is not executed
2
lilezek 1 Мар 2018 в 18:00