Быть или не быть...
Звучит как алгоритм!
– аллюзия на Шекспира.
Управление потоком выполнения
Пока что мы писали крайне простые программы, где всё было линейно. И это прекрасно, но ценность таких программ часто низка. Поэтому в рамках данного занятия рассмотрим следующие темы:
- Управляющие конструкции
- Циклы
Управляющие конструкции
В Си выражение типа a = 1;
– оператор, а точка с запятой – обязательная
завершающая часть оператора. Фигурные скобки – группировка операторов в блоки,
синтаксически эквивалентные одному оператору. Мы уже выдели это на предыдущей
теме – при объявлении функции main
.
Оператор if-else
Оператор 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
) – используйте их!
else-if
if (выражение1)
оператор1
else if (выражение2)
оператор2
else
оператор3
– эта конструкция – объединение нескольких операторов if-else
.
Один из способов задать более 2-х вариантов развития событий (аналог elif
из python
).