Что быстрее выполнить, если (c == 0 && d == 0 && etc ...) или если (c == 0) if (d == 0) etc ...? - PullRequest
1 голос
/ 15 февраля 2012

Мой вопрос:

если у меня есть оператор if с, скажем, 10 условиями, если я соберу их все в одно условие if, будет ли компилятор проверять условие всех 10 операторов? или он сломается, как только найдет ложное условие?

В Если еще выполнение завершится, как только будет найдено ложное условие, так ли это, например, в: if(c==0 && d==4 || r ==3 && etc...).

Ответы [ 4 ]

2 голосов
/ 15 февраля 2012

Зависит от того, являются ли логические операторы && и ||использовать короткое замыкание или нет.В таких языках, как C, C ++, C #, Java, это так.

Короткое замыкание означает, что переход слева направо, если значение всего логического выражения может быть точно определено, остальные выражения не являютсяоценены.

2 голосов
/ 15 февраля 2012

Это называется короткое замыкание .

Например, в C ++ для вложенных условий && гарантируется, что проверка остановится при первом обнаруженном false.

Это, конечно, сильно зависит от языка.

0 голосов
/ 30 июня 2012

Для всех приемлемых языков / языковых реализаций они должны быть одинаковыми.

Как отмечали другие, синтаксис if (a && b && c) {code} оптимизирован разумными компиляторами.

Что до сих пор не объяснено, так это то, что они частично оптимизированы, потому что компилятору придется активно делать неправильные вещи, чтобы сделать его менее оптимизированным. Причина в том, что это «короткое замыкание» обычно также встроено в машинный код. Ваш код станет ассемблерным кодом, например:

IFNOT a, skip_code
IFNOT b, skip_code
IFNOT c, skip_code

code:
   ...

skip_code:
   ...

И, таким образом, ЦП будет проходить через каждый из этих тестов, если проверка не будет завершена. Если if находит ошибку, она просто переходит в конец и игнорирует остаток блока if (...) {code}.

Обратите внимание, как это выглядит:

if (a) {
   if (b) {
       if (c) {
           code
       }
   }
}

Это одно и то же. Любой здравомыслящий компилятор удостоверится, что они одинаковы.

Чтобы сделать это БЕЗ короткого замыкания, автору компилятора придется активно выбирать что-то вроде:

SET badForCodeRun,False

IF a, skipA
SET badForCodeRun, True
GOTO skipCode

skipA:

IF b, skipB
SET badForCodeRun, True
...

skipCode:

Честно говоря, я даже не удосужился напечатать это неправильно, потому что это так многословно и глупо :) Короткий ответ: это никогда не будет иначе, чем короткое замыкание.

0 голосов
/ 15 февраля 2012

зависит от компилятора ... лентяй и ярлыки

но большинство из них, когда у вас есть (условие && условие .. && ...), оно закончится при первом ложном ...

так что если (условие) быстрее, чем 10, то если условия ....

...