Лекция 4. Условный оператор

Условный оператор обеспечивает возможность выполнения или, наоборот, пропуска некоторых инструкций в зависимости от некоторого условия.

if (условие) {
    главная_ветвь_1;
    ...
    главная_ветвь_N;
} else {
    альтернативная_ветвь_1;
    ...
    альтернативная_ветвь_N;
}

Если условие истинно, то выполнится главная ветвь, если ложно – альтернативная.

Укороченная форма без альтернативной ветви

Если в операторе if нет инструкций в альтернативной ветви, её можно опустить:

if (условие) {
    главная_ветвь_1;
    ...
    главная_ветвь_N;
}

К вопросу об операторных скобках

Если в главной или альтернативной ветви стоит только одна инструкция, то операторные скобки вокруг неё можно опустить, например:

if (условие)
    главная ветвь;

или

if (условие)
    главная_ветвь;
else
    альтернативная_ветвь;

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

Операторы сравнения

TODO: операторы сравнения

Логические операторы

Приоритеты операций

  Операторы                   выполняются
  () [] -> .             слева направо
унарные ! ~ ++ -- + - * (type) sizeof   справа налево
  * / %               слева направо
  + -                 слева направо
  < <= > >=             слева направо
  == !=                 слева направо
  &                   слева направо
  ^                   слева направо
                    слева направо
  &&                   слева направо
                  слева направо
  ?:                   справа налево
  = += -= *= /= %= &= ^= <<= >>= справа налево
  ,                   слева направо

Замечание об использовании операторов = и ==

Рассмотрим случай, когда нужно сравнить число с нулём и если оно нулевое, выполнить некоторый код:

if (a == 0) {
    ...
}

В языке C внешний вид операторов = (присваивание) и == (сравнение) очень похож, поэтому их легко перепутать. Ситуация усугубляется тем, что в математике для обоих этих операций используется одно и то же обозначение. Рассмотрим случай, когда написан следующий код:

if (a = 0) { // Ошибка в условии.
    ... // главная ветвь не выполнится никогда.
}

Этот кусок кода отлично компилируется, вот только работает не так, как надо. Дело в том, что у операции присваивания в C есть результат, и этот результат является ничем иным, как присвоенным значением. То есть приведённое условие делает одновременное два действия:

  • присваивает переменной a ноль
  • возвращает в качестве результата ноль, то есть ложь

Как видим, в результате небольшой опечатки мы изменили значение переменной a, которую менять не планировали, и за одно никогда не попадём в код в главной ветви if-а. Поэтому надо внимательно следить за тем, чтобы сравнение обозначалось именно двойным знаком ==. Некоторые программисты даже предпочитают в случае сравнения числа с некоторой константой писать константу слева, что приведёт к синтаксической ошибке при опечатке и попытке присвоить константе значение:

if (0 == a) {
    ...
}

К сожалению, такой подход не поможет при сравнении двух переменных. Поэтому о разнице сравнения и присваивания важно помнить.