Блоки и отступы
В блоке может быть сколько угодно инструкций. Всё, что стоит между { и }, принадлежит блоку, и когда условие истинно, выполняется всё это по очереди:
int temperature = 32;
if (temperature > 30) {
printf("Очень жарко\n");
printf("Пейте больше воды\n");
}
printf("Хорошего дня\n");Программа выведет:
Очень жарко
Пейте больше воды
Хорошего дняБлок заканчивается закрывающей фигурной скобкой }. Строка с Хорошего дня стоит после неё, в блок не входит и поэтому выполняется всегда, истинно условие или нет.
Строки блока написаны с отступом: они начинаются с 4 пробелов. Компилятору отступы безразличны. Что входит в блок, решают только фигурные скобки, и программа работала бы, даже если бы вы вообще не делали отступов. Отступы нужны людям: по ним сразу видно, какие строки принадлежат блоку, поэтому программисты всегда их делают. Считать пробелы не нужно. Когда вы нажимаете Enter после {, редактор сам делает отступ в следующей строке, а клавиша Tab тоже вставляет 4 пробела.
Раз блок определяют скобки, а не отступы, отступы могут даже ввести в заблуждение:
int temperature = 20;
if (temperature > 30) {
printf("Очень жарко\n");
}
printf("Пейте больше воды\n");Программа выведет:
Пейте больше водыПоследняя строка кода сдвинута вправо, но стоит после }, поэтому в блок не входит и выполняется даже при 20 градусах.
То же самое происходит, если опустить фигурные скобки. C это позволяет, но тогда к if относится только одна инструкция, которая стоит сразу после условия:
int temperature = 20;
if (temperature > 30)
printf("Очень жарко\n");
printf("Пейте больше воды\n");Программа выведет:
Пейте больше водыВторой printf к условию не относится, как бы он ни был сдвинут. Такой код обычно сначала правильный — одна инструкция и никаких скобок — и ломается позже, когда кто-то добавляет в блок вторую строку и забывает добавить скобки. Поэтому в этом курсе фигурные скобки пишутся всегда, даже вокруг одной инструкции.
Если забыть закрывающую скобку }, компилятор сообщит error: expected '}' в последней строке программы, потому что только там он обнаруживает, что скобки не хватает. Искать её, однако, нужно выше: после последней строки того блока, который вы не закрыли. Примечание под ошибкой, to match this '{', может указывать на { после int main(void): компилятор сопоставляет скобки по порядку, поэтому }, предназначавшаяся для main, закрыла ваш блок.
Задание
- 1
Программа просит подключить зарядку, хотя аккумулятор заряжен на 80%. Строка, выводящая
Подключите зарядку, сдвинута вправо, но стоит после}. Перенесите}под неё, чтобы строка входила в блок инструкцииif. Тогда программа выведет толькоЗаряд: 80%. - 2
Измените
batteryна15и запустите программу. Теперь условие истинно, и программа выводит все три строки:Низкий заряд Подключите зарядку Заряд: 15%