Условные операторы Си
Быть или не быть...
Звучит как алгоритм!
– аллюзия на Шекспира.
Пока что мы писали крайне простые программы, где всё было линейно. И это прекрасно, но ценность таких программ часто низка. Поэтому в рамках данного занятия рассмотрим следующие темы:
В Си выражение типа a = 1;
– оператор, а точка с запятой – обязательная
завершающая часть оператора. Фигурные скобки – группировка операторов в блоки,
синтаксически эквивалентные одному оператору. Мы уже выдели это на предыдущей
теме – при объявлении функции main
.
Оператор if-else определяет процесс принятия альтернативных решений.
if (выражение) оператор1 else оператор2
Ветка else необязательна. В случае, если выражение истинно, то выполнится
оператор1
, иначе – оператор2
. После чего продолжится выполнение программы
после блока if
.
В качестве примера напишем программу для целочисленного деления одного числа на другое.
Здесь моментом принятия решения будет проверка знаменателя – операция деления на ноль не определена.
#include <stdio.h> int main(void) { int a; int b; scanf("%d %d", &a, &b); // Кладём в a и b два числа со стандартного ввода. if (b == 0) { return 1; } else { printf("%d\n", a / b); } return 0; }
Истина – всего лишь ненулевое значение. 0 = ложь (ну и NULL, но об этом позже). Так что мы могли написать:
... if (!b) { return 1; } ...
Ещё лучше – инвертировать ветки условий:
... if (b) { printf("%d\n", a / b); } else { return 1; } ...
– помимо повышения читаемости, мы ещё и потенциально ускоряем работу на процессорах с конвеерной архитектурой – вероятность исполнения первого условия предполагаемо выше.
Сложный, запутанный и плохой вариант кода для получения максимума:
// ещё и вариант определения переменных (плохой) float a = 1, b = 2; if (a) if (b / a < 1) return 1; else return 0; return -1;
– довольно вычурный вариант вернуть 1
при a > b, -1
при b >= a, либо 0
в случае, если a == 0
.
Предлагаю найти в нём ошибку.
Более корректный вариант:
float a = 1; float b = 2; if (a) { if (b / a < 1) { return 1; } } else { return 0; } return -1;
– фигурные скобки явно указывают, что к чему (else
применяется к ближайшему
if
) – используйте их!
if (выражение1) оператор1 else if (выражение2) оператор2 else оператор3
– эта конструкция – объединение нескольких операторов if-else
.
Один из способов задать более 2-х вариантов развития событий (аналог elif
из python
).