Синтаксис потока управления в 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'.