Лекция 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
используется для завершения работы функции и передачи результата, если функция ожидает возвращаемое значение.
Лучшие практики программирования
- Выражение в операторе
switch
и значенияcase
должны быть целочисленными или символьными. - Используйте ветвь
default
в оператореswitch
, чтобы предусмотреть необработанные случаи. - Для упрощения понимания кода объединяйте несколько операторов в блоки с помощью
{ }
. - В циклах обязательно предусматривать начальные установки, модификацию параметров и условия завершения.
- При построении бесконечного цикла обязательно предусматривать условие выхода из него, чтобы избежать "зависания" программы.
- Не используйте
goto
без необходимости. Применяйте его для выхода из многократно вложенных структур, но избегайте его без ясной необходимости.