Вызов функций
Чтобы функция выполнилась, её нужно вызвать: написать её имя, затем круглые скобки иточку с запятой. Вызов функции — это инструкция. Функции вызывают из тела main:
#include <stdio.h>
void greet(void) {
printf("Привет!\n");
printf("Хорошего дня!\n");
}
int main(void) {
greet();
return 0;
}Эта программа выводит:
Привет!
Хорошего дня!Когда программа, выполняя main, доходит до вызова функции, она переходит в функцию и выполняетеё тело сверху вниз. Затем возвращается и продолжает с инструкции после вызова. Функцию можно вызыватьсколько угодно раз:
#include <stdio.h>
void greet(void) {
printf("Привет!\n");
}
int main(void) {
printf("Старт\n");
greet();
greet();
printf("Конец\n");
return 0;
}Эта программа выводит:
Старт
Привет!
Привет!
КонецПрограмма начинается в main: выводит Старт, дважды выполняет тело greetи в конце выводит Конец. Функция, которую никто не вызывает, не выполняется никогда.
Вызывать функции вам не в новинку. printf — тоже функция, и каждая строкаprintf("Привет!\n");, которую вы писали, — это вызов: имя функции, круглые скобки и точка с запятой.Так же устроены strlen(name) и toupper(letter) из урока о строках. Эти функции за васнаписал кто-то другой. Позже в этом уроке вы увидите, как компилятор узнаёт о них.
Остерегайтесь двух частых ошибок:
- Нет круглых скобок.
greet;без скобок не вызывает функцию. Программа компилируется, нофункция не выполняется, и ничего не выводится. - Другое имя. Имя в вызове должно в точности совпадать с именем в определении, включая регистр букв.Если в первой программе заменить вызов на
Greet();, программа не скомпилируется, и сообщение обошибке начнётся так:
main.c:9:5: error: call to undeclared function 'Greet'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
9 | Greet();
| ^
main.c:9:5: note: did you mean 'greet'?«Call to undeclared function» (по-русски «вызов необъявленной функции») означает, что программа вызываетфункцию, которую компилятор не знает. Остальную часть первой строки вы поймёте в следующем упражнении.Строка с note — полезная подсказка: вы имели в виду greet?
Задание
- 1
В
mainвызовите функциюprint_bannerна месте обоих комментариев. Тогда программавыведет то же, что и длинная программа из предыдущего упражнения, ноmainстанет гораздокороче. - 2
В игре появился третий уровень. В конце
main, передreturn 0;, выведитеУровень 3 пройдени ещё раз вызовитеprint_banner. - 3
Добавьте в тело
print_bannerещё одну инструкцию, междуОтлично!и последнейстрокой, которая выводитВы получили звезду.Запустите программу: сообщение изменилось после всехтрёх уровней. Вы изменили код в одном месте, и все три вызова стали делать что-то новое. Именно для этого инужны функции.