Есть ли техническая разница между else ... if / else if? - PullRequest
1 голос
/ 18 октября 2010

Я знаю, что это не будет одинаковым для всех языков, но я удивляюсь этому некоторое время.

Поскольку название не очень понятно, есть ли техническая разница между * 1003?*

if (...) {
   // ...
} else if (...) {
   // ...
}

и

if (...) {
    ...
} else {
    if (...) {
        ...
    }
}

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

Но с технической точки зрения я не уверен.Компиляторы, как правило, делают что-то особенное с else if, или он обрабатывается так, как если бы он был однострочным, как:

if (...)
   singleLine();

, но выглядит как:

else
   if (...) // Counts as just a single line command

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

Ответы [ 2 ]

7 голосов
/ 18 октября 2010

В C ++ оба абсолютно идентичны.Проверьте формальную грамматику.В приведенном вами примере if в else if - это действительно новый кусок кода, так же, как вы показали в своем вопросе, он аналогичен одной строке.Форматирование и расположение кода лучше с else if.

Грубо говоря, грамматика определяет:

<if structure> -> if <condition> <code blob> else <code blob>
<code blob> -> <if structure>

Так что, когда вы делаете

 if (1) do(); else if (3) stuff(); else thing();` 

всеpiece

 if (3) stuff(); else thing();

- это просто <code blob> из else в первой структуре if / else.

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

Я уверен, что любой приличный компилятор сгенерирует один и тот же код для обеих форм.Единственная причина, по которой я могу подумать об использовании второй формы, заключается в том, что вы ожидаете добавить код к другому, который не контролируется вложенным if.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...