Они не могут замыкать.Чтобы узнать, равны ли x == y
, x != y
и т. Д. true
или false
, необходимо оценить оба значения: x и y.Короткое замыкание относится к логическим логическим операторам &&
и ||
.Известно, что логическое И ложно, если первый аргумент ложен, а логическое ИЛИ истинно, если первый аргумент истинен.В этих случаях вам не нужно оценивать второй аргумент, это называется коротким замыканием.
Редактировать: это следует из обсуждения того, почему x >= y
не замыкают накоротко, когдаоперанды являются целыми числами без знака, а x
равен нулю:
Для логических операндов короткое замыкание предоставляется бесплатно и не зависит от реализации.Машинный код для if(f() && g()) stmt;
, скорее всего, будет выглядеть примерно так:
call f
test return value of f
jump to next on zero
call g
test return value of g
jump to next on zero
execute stmt
next: ...
Чтобы предотвратить короткое замыкание, вам на самом деле необходимо выполнить вычисление результата оператора и проверить его после этого .Это приведет вас к регистрации и сделает код менее эффективным.
Для нелогических операторов ситуация противоположная.Обязательное короткое замыкание подразумевает:
- Компилятор не может выбрать оценку выражения, которое использует минимальное количество регистров.
- Семантика может быть определена реализацией (или даже не определена) для многих случаев, например, при сравнении с максимальным значением.
Компилятору необходимо добавить дополнительный тест / переход.Для if(f() > g()) stmt;
машинный код будет выглядеть следующим образом:
call f
mov return value of f to R1
test return value of f
jump to next on zero
call g
compare R1 with return value of g
jump to next on less-than equal
execute stmt
next: ...
Обратите внимание, что в противном случае первый тест и переход просто не нужны.