X

if else if if else

Давайте рассмотрим как будут обрабатываться выражения типа этого, а именно порядок выполнения if-else:

if(a>0) if(a<3) a++; else if(a>1) a++; else a--; else a--;

Разумеется такие выражения, это яркий пример гавнокодерства, но нам все равно. Мы будем разбираться как работает компилятор, потому что такой бред обажают на собеседованиях. Итак вперед.

Самое главное что надо помнить это:

  • else применяется к ближайшему if
  • чтобы пропустил компилятор между if() и else должно быть только одно выражение. Это может быть тело условия {}, может быть какое-то одно выражение a++, или другое условие, но обязательно одно.

Рассмотрим выражение:

if(a>0) if(a<3) a++; else
if(a>1) a++; else a--; else a--;

теперь используя правила описанные выше, расставим тела условий:

if(a>0) { if(a<3) { a++; } else
{ if(a>1) { a++; } else { a--; } } } else { a--; }

теперь отформатируем:

if(a>0) {
 if(a<3) {
  a++;
 } else {
  if(a>1) {
   a++;
  } else {
   a--;
  }
 }
} else {
 a--;
}

Теперь код читаемый.

 

Давайте рассмотрим еще один пример:

if(a>1) a++; if (a>2) a++;
else a--; else a--;

т.к. после первого if-a уже есть выражение a++; то следующий if это уже следующее выражение. Поэтому нарушается наше правило одного выражения между if-else и соответственно компилятор покажет ошибку.

давайте расставим тела условий и посмотрим что получилось:

if(a>1) {a++;} if (a>2) {a++;}
else {a--;} else {a--;}

отформатируем

if(a>1) {
 a++;
}

if (a>2) {
 a++;
} else {
 a--;
}

else { // <-- лишний
 a--;
}

как видим, действительно, последний else не в тему. Разумеется мы можем это исправить расширив тело первого цикла:

if(a>1) {
 a++;
 if (a>2) {
  a++;
 } else {
  a--;
 }
}
else {
 a--;
}

так уже будет все работать. Но это уже совсем другая программа 🙂

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

 

Вопросы для собеседования:

  • объясните как будет работать такое выражение:
    if(a>0) if(a<3) if(a>1) a++; else a--;
    else if(a>1) a++; else if(a>1) a++; else a--; else
    if(a>1) a++; else a--;
  • объясните как будет работать такое выражение:
    if(a>0) if(a<3) if(a>1) a++; else a--;
    else if(a>1) a++; if(a>1) a++; else a--; else
    if(a>1) a++;

 

Ответы:

  • вот так:
    if(a>0) {
     if(a<3) {
      if(a>1) {
       a++;
      } else {
       a--;
      }
     } else {
      if(a>1) {
       a++;
      } else {
       if(a>1) {
        a++;
       } else {
        a--;
       }
      }
     }
    } else {
     if(a>1) {
      a++;
     } else {
      a--;
     }
    }
  • Не будет работать, т.к. в выражении допущена ошибка:
    if(a>0) {
     if(a<3) {
      if(a>1) {
       a++;
      } else {
       a--;
      }
     } else {
      if(a>1) {
       a++;
      }
     }
    }
    
    if(a>1) {
     a++;
    } else {
     a--;
    }
    
    else // <--лишний
    
    if(a>1) a++;
Категории: Java Java labs