Синтаксис потока управления в C++

В следующем примере C++ (отступ был пропущен по назначению).

if(condA)          // if #1
if(condB)          // if #2
if(condC)          // if #3
if(condD)          // if #4
funcA();
else if(condD)     // else #1 if #5
funcB();
else if(condE)     // else #2 if #6
funcC();
else               // else #3
funcD();
else if(condF)     // else #4 if #7
funcE();
else               // else #5
funcF();

Какие else относится к тому, что if и какое правило по этому поводу? (да, я знаю, используя { } решу это).

6 ответов

Решение

DeadMG прав. На случай, если вы заинтересованы, правило

else прикрепляется к последнему свободному (то есть незащищенному скобками и без соответствующего остального) if,

if(condA)          // if #1
    if(condB)          // if #2
        if(condC)          // if #3
            if(condD)          // if #4
                funcA();
            else if(condD)     // else #1 if #5
                funcB();
            else if(condE)     // else #2 if #6
                funcC();
            else               // else #3
                funcD();
        else if(condF)     // else #4 if #7
            funcE();
        else               // else #5
            funcF();

Каждый else всегда относится к внутреннему if возможный.

Так

if (a)
if (b) B;
else C;

эквивалентно

if (a) {
  if (b) B;
  else C;
}

Никогда не пишите такой код в производственной среде. Это укусит тебя.

C++ знает, что еще совпадает с каким if, и компиляторы C++ имеют просто отличные парсеры, которые разбираются с этим во флэш-памяти. Проблема в том, что ты не очень хорош в этом.

Запустите это через prettyprinter на C++, и форматированный текст сделает это очень понятным.

Это называется проблемой "Dangling else". Соглашение для решения этой проблемы заключается в том, чтобы прикрепить 'else' к ближайшему оператору 'if'.

Висячие еще википедия

Другие вопросы по тегам