Перейти к содержанию

Лекция 7: Управляющие инструкции языка

"Определенно, что-то есть в его словах. Например, буквы. 🤔"


Введение

Управляющие операторы языка Си предназначены для выполнения действий и управления ходом выполнения программы. Несколько последовательных операторов образуют последовательность операторов.

Пустой оператор — простейшая конструкция, представляющая пустое выражение, записывается как ;.

Инструкция — элементарное действие, записываемое в виде (выражение);.
Блок инструкций — последовательность операторов, заключённая в { }. Он может использоваться в функциях, циклах и условных конструкциях.


Классификация инструкций языка Си

Инструкции в языке Си делятся на:

  • Помеченные инструкции
  • Инструкции-выражения
  • Составные инструкции
  • Инструкции выбора
  • Циклические инструкции
  • Инструкции перехода

Инструкции выбора (if, switch)

Условный оператор if

Задача условного оператора — изменить порядок выполнения программы в зависимости от условия.

Форма записи:

if (выражение) оператор1;
else оператор2;

Пример использования:

if (a > b)
    max = a;
else
    max = b;

Однако при добавлении новых условий с помощью if-else логика ветвления может значительно усложняться, что приведет к ухудшению читаемости и модификации кода. Если в коде слишком много условных операторов, сложнее отслеживать логику программы и вносить изменения. Это также может привести к дублированию кода.

Тернарный оператор

Тернарный оператор — компактная форма условного оператора:

c = (a > b) ? a : b;

Это выражение присваивает значение a, если условие (a > b) истинно, или b, если оно ложно. Тернарный оператор полезен в ситуациях, когда нужно присвоить значение переменной в зависимости от условия. В таких случаях он намного более удобен и читаем, чем длинная конструкция if-else.

Инструкция switch

Оператор switch организует выбор из нескольких альтернатив. В отличие от if-else, оператор switch применяется, когда имеется фиксированное число возможных вариантов.

Форма записи:

switch (выражение) {
    case значение1:
        операторы;
        break;
    case значение2:
        операторы;
        break;
    default:
        операторы;
}

Важно использовать break, чтобы избежать "провалов" — перехода выполнения к следующему case. Без break выполнение продолжится в следующий case, что может быть неожиданным.


Операторы цикла

Циклы — это конструкции, которые организуют повторение кода.

В языке Си доступны следующие виды циклов:

  • Цикл с предусловием while:
while (условие)
    операторы;
  • Цикл с постусловием do while:
do {
    операторы;
} while (условие);
  • Цикл с параметром for:
for (инициализация; условие; модификация)
    операторы;

Цикл for подходит, когда заранее известно количество итераций, в то время как while и do-while чаще используются, когда условие продолжения цикла зависит от внешних факторов.

Пример цикла с параметром for:

for (int i = 0; i < n; i++) {
    printf("%d\n", i);
}

Операторы перехода и возврата

Оператор goto

Используется для безусловного перехода к метке:

goto метка;
...
метка:
    операторы;

Хотя goto редко используется, он может быть полезен для выхода из многократно вложенных циклов или условий, где использование других операторов, таких как break или continue, не подходит.

Оператор break

Прерывает выполнение текущего цикла или инструкции switch.

Пример:

while (1) {
    if (условие) {
        break; // Прерывание цикла
    }
}

Оператор continue

Пропускает оставшуюся часть текущей итерации и переходит к следующей.

Пример:

for (int i = 0; i < n; i++) {
    if (i % 2 == 0)
        continue; // Переход к следующей итерации
    printf("%d\n", i);  // Выполнится только для нечетных чисел
}

Оператор return

Завершает выполнение функции и возвращает значение:

return выражение;

Оператор return используется для завершения работы функции и передачи результата, если функция ожидает возвращаемое значение.


Лучшие практики программирования

  1. Выражение в операторе switch и значения case должны быть целочисленными или символьными.
  2. Используйте ветвь default в операторе switch, чтобы предусмотреть необработанные случаи.
  3. Для упрощения понимания кода объединяйте несколько операторов в блоки с помощью { }.
  4. В циклах обязательно предусматривать начальные установки, модификацию параметров и условия завершения.
  5. При построении бесконечного цикла обязательно предусматривать условие выхода из него, чтобы избежать "зависания" программы.
  6. Не используйте goto без необходимости. Применяйте его для выхода из многократно вложенных структур, но избегайте его без ясной необходимости.

All of us carry trauma
And in lieu of an explanation
I will pour oil from the cup
On the pyre of abdication