Управляющие конструкции C: if, else, switch, тернарный оператор — принятие решений
Логические значения в C
В C нет встроенного типа bool до C99 (<stdbool.h>). Любое не-нулевое значение — истина (true), ноль или NULL — ложь (false). Результаты операций сравнения и логических — int (1 или 0).
Оператор if
Простая форма
if (условие)
оператор; // один оператор
// или блок:
if (условие) {
оператор1;
оператор2;
...
}
Условие — любое скалярное выражение (число, указатель).
Форма if-else
if (условие)
оператор_если_истина;
else
оператор_если_ложь;
Цепочка if-else if-else
if (score >= 90)
grade = 'A';
else if (score >= 80)
grade = 'B';
else if (score >= 70)
grade = 'C';
else
grade = 'F';
Вложенные if
if (x > 0) {
if (y > 0)
printf("Quadrant I\n");
else
printf("Quadrant IV\n");
} else {
if (y > 0)
printf("Quadrant II\n");
else
printf("Quadrant III\n");
}
Проблема «висячего else»: else относится к ближайшему if без else. Используйте фигурные скобки для ясности.
Оператор switch
Позволяет проверить значение целочисленного выражения против списка констант.
switch (выражение) {
case константа1:
операторы;
break; // важно! иначе «проваливание» (fall-through)
case константа2:
case константа3: // группировка случаев
операторы;
break;
default: // необязательно, если ни один case не совпал
операторы;
}
Правила switch
- Выражение — целочисленный тип (
int,char,enum,short...). Неfloat,double, строки. - Метки
case— константные выражения (compile-time), уникальные. breakпрерывает switch. Без него выполнение «проваливается» в следующий case.default— где угодно, но обычно в конце.
Пример: калькулятор
int a = 10, b = 5;
char op = '*';
int result;
switch (op) {
case '+': result = a + b; break;
case '-': result = a - b; break;
case '*': result = a * b; break;
case '/':
if (b != 0) result = a / b;
else { printf("Деление на 0!\n"); result = 0; }
break;
default: printf("Неизвестная операция\n"); result = 0;
}
printf("Результат: %d\n", result);
Намеренный fall-through (C17: атрибут [[fallthrough]])
switch (month) {
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
days = 31;
break;
case 4: case 6: case 9: case 11:
days = 30;
break;
case 2:
days = is_leap(year) ? 29 : 28;
break;
default:
days = -1; // ошибка
}
Тернарный оператор ?:
Единственный тернарный оператор. Синтаксис:
условие ? выражение_если_истина : выражение_если_ложь
Возвращает значение — можно использовать в присваивании, аргументе функции и т.д.
Примеры
int max = (a > b) ? a : b;
int abs = (x >= 0) ? x : -x;
printf("Статус: %s\n", (ready) ? "Готово" : "Не готово");
return (error) ? -1 : 0;
Вложенные тернарные (читать трудно — избегайте)
int sign = (x > 0) ? 1 : (x < 0) ? -1 : 0;
Сравнение if-else и switch
| Критерий | if-else | switch |
|---|---|---|
| Тип условия | Любое скалярное, сложные выражения | Только целочисленные константы |
| Диапазоны | Да (x > 0 && x < 10) | Нет (только дискретные значения) |
| Строки | Через strcmp | Нет |
| Производительность | O(n) проверок | O(1) — jump table (оптимизация компилятора) |
| Читаемость | Гибко | Чище для множества констант |
Частые ошибки
- Забытый
breakвswitch→ неожиданный fall-through. - Присваивание вместо сравнения:
if (x = 5)вместоif (x == 5). Компиляторы предупреждают (-Wparentheses). - Сравнение строк через
==:if (str == "hello")— сравнивает указатели! Используйтеstrcmp(str, "hello") == 0. - Пустой оператор после
if:if (x > 0); { ... }— блок выполнится всегда.
Современные альтернативы (C23)
C23 добавляет bool, true, false как ключевые слова (раньше через <stdbool.h>). Также typeof для выражений.
Язык C
- Освоение оператора switch в C#: синтаксис, примеры и лучшие практики
- Оператор break в C#: как и когда использовать
- Оператор continue в C#: как эффективно пропускать итерации циклов
- Освоение оператора break в C++
- Освоение оператора continue в C++: практические примеры и управление циклами
- Условные операторы в C: if, else и не только — подробное руководство
- Оператор pass в Python: практическое руководство
- Базовый синтаксис C: токены, идентификаторы, ключевые слова и пробелы
- Усиление принятия решений в передовитом производстве через мощную аналитику
- Оптимизация приёма данных для более умного принятия решений