Вирази if-else застосовуються для вираження ймовірних рішень. Формально, синтаксис наступний:
if (вираз)
твердження1
else
твердження2
де else-частина не є обов'язковою. Вираз обчислюється; якщо він істинний (тобто вираз не має нульового значення), буде виконано твердження1. Якщо хибний (вираз має нульове значення) і наявна else-частина, тоді виконується твердження2, натомість.
Оскільки if просто перевіряє числове значення виразу, це дозволяє використовувати певні скорочення в кодуванні. Найочевиднішим є написання
if (вираз)
замість
if (вираз != 0)
Іноді це виглядає природньо і зрозуміло, а інколи занадто зашифровано.
Оскільки else-частина у виразі if-else не обов'язкова, то може виникнути неоднозначність, коли якийсь else пропущено у гніздованій послідовності виразів if. Це вирішується шляхом пов'язування else із найближчим попереднім if, що не має відповідного else. Так, наприклад, у
if (n > 0)
if (a > b)
z = a;
else
z = b;
else відповідає if, що знаходиться всередині, що ми також підкреслили відступами. Якщо це не те, чого ви хотіли, тоді потрібно використати фігурні дужки, щоб змусити до відповідної приналежності:
if (n > 0) {
if (a > b)
z = a;
}
else
z = b;
Неоднозначність особливо небезпечна в ситуаціях як наступна:
if (n > 0)
for (i = 0; i < n; i++)
if (s[i] > 0) {
printf("...");
return i;
}
else /* ПОМИЛКА */
printf("error -- n is negative\n");
Не зважаючи на те, що відступи ніби недвозначно вказують на те, що саме ви маєте на увазі, компілятор не збагне цього і пов'яже else з if всередині. Таку помилку буває дуже важко знайти пізніше, тому у випадку гніздованих if краще вживати фігурні дужки.
До речі, зверніть увагу на крапки з комою після z = a
if (a > b)
z = a;
else
z = b;
Вони там тому, що граматично за if слідує твердження, а стверджувальні вирази на зразок «a = z;» завжди мають закінчуватися крапкою з комою.