Оценка каждого условного оператора в блоке if ... else if ... - PullRequest
5 голосов
/ 15 октября 2010

Оценивает ли Objective-C каждое утверждение в блоке if... else if... или оценивает каждое из них по мере их поступления, а затем пропускает оставшиеся оценки, если было найдено истинное условие?

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

И да, я знаю, что содержимое самого блока if не выполняется, но я имею в виду фактические операторы, которые оцениваются.

Пример

if ([condition A] == test) {
  // Do something
} else if ([condition B] == test) {
  // Do something    
} else if ([condition C] == test) {
  // Do something    
} else {
  // Do something because all other tests failed
}    

Итак ... если условие A истинно, условия B и C все равно оцениваются?

Если они это делают, то выполняет ли оператор switch то же самое?или коммутатор только проверяет каждое условие по мере его поступления, а затем выходит из оценки из-за разрыва?

Насколько я понимаю, в блоке if... else if... оценивается каждое условие и, следовательно, используется переключательили вложенный if (тьфу - не смейтесь там мысли) может быть быстрее при больших операциях оценки на большом количестве данных (сотни тысяч элементов будутпроверил потенциально сотню утверждений).

Просто любопытно: -)

Ответы [ 3 ]

12 голосов
/ 15 октября 2010

Нет, если выполняется условие A, B и C не оцениваются.Действительно, они являются частью предложений else, которые в любом случае не будут выполняться тогда.

Просто примечание: if (condA || condB) или if (condA && condB) также оценивает лениво, т.е. в первом случае condBоценивается, только если condA имеет значение false, во втором случае, когда condA имеет значение true.

4 голосов
/ 15 октября 2010

Он оценивает их только так, как приходит к ним.Блок if ... else if эквивалентен if.. else {if...}.Он ведет себя так же, как вложенный ifs, он просто отформатирован и пропускает некоторые скобки.

2 голосов
/ 15 октября 2010

За пределами [] цель-c ведет себя точно так же, как и С.

Для if() ... else if() ... else ... цепочек это означает, что каждое выражение оценивается до тех пор, пока одно из них не станет истинным и не будет введен блок В основном

if (a) {
    ...
} else if (b) {
    ...
} else {
    ...
}

интерпретируется как

if (a) {
    ...
} else {
    if (b) {
        ...
    } else {
        ...
    }
}
...