Являются ли операторы сравнения целых чисел короткими замыканиями в C ++? - PullRequest
1 голос
/ 13 января 2011

Как и состояния заголовков, операторы сравнения (==,! =,>,> =, <, <=) Замыкаются целочисленными (или любыми числовыми типами данных, такими как float и т. Д.) В C ++? </p>

Ответы [ 4 ]

6 голосов
/ 13 января 2011

Они не могут замыкать.Чтобы узнать, равны ли 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: ...
    

    Обратите внимание, что в противном случае первый тест и переход просто не нужны.

1 голос
/ 13 января 2011

Как это будет работать?Короткое замыкание означает, что вы можете избежать оценки RHS, основываясь исключительно на результате оценки LHS.

например

true || false

не нужно оценивать RHS, потому что true || x - это true независимо от того, что x окажется.

Но это не сработает ни для одного из перечисленных сравнений.Например:

5 == x

Как вы можете узнать результат выражения, не зная x?

1 голос
/ 13 января 2011

Нет, как они могли быть. Чтобы проверить, нужно ли 1 == 2 проверять как 1, так и 2. (Ofcoruse, компилятор может выполнить много переупорядочения, статической проверки, оптимизации и т. Д., Но это не наследуется для c ++)

1 голос
/ 13 января 2011

Нет.Операторы сравнения требуют, чтобы оба операнда оценили правильный ответ.Напротив, логические операторы && и || в некоторых случаях не нуждаются в оценке правильного операнда, чтобы получить правильный ответ, и поэтому выполняют «короткое замыкание».

...