Локальные переменные
Внутри функции можно создавать переменные, как и в main. Но такая переменная существует тольковнутри своей функции: она создаётся, когда функция выполняется, и исчезает, когда функция завершается. Внефункции компилятор её не знает:
#include <stdio.h>
void print_total(void) {
int total = 5 + 3;
printf("%d\n", total);
}
int main(void) {
print_total();
printf("%d\n", total);
return 0;
}Программа не компилируется:
main.c:10:20: error: use of undeclared identifier 'total'
10 | printf("%d\n", total);
| ^~~~~
1 error generated.В строке 10 main пытается вывести переменную total, которая существует только внутрифункции print_total. «Use of undeclared identifier» (по-русски «использование необъявленногоидентификатора») означает, что программа использует имя, которого компилятор в этом месте не знает. Параметрыустроены так же: они существуют только внутри своей функции.
Переменная, созданная внутри функции, называется локальной: она принадлежит только этойфункции. Часть программы, в которой переменная существует, называется её областью видимости.Вы уже знаете, что переменная, созданная в блоке, например i в цикле for, существуеттолько до } этого блока. Тело функции — тоже блок. И это относится также к main,ведь main — тоже функция: другие функции не видят её переменных. Когда функции нужно значение изmain, передайте его как аргумент.
Чем хорошо, что локальные переменные остаются внутри своих функций?
- Функции не мешают друг другу. В двух функциях может быть по переменной
total, и это две разныепеременные: если изменить одну, другая не изменится. - Чтобы пользоваться функцией, нужно знать только, что ей дать (аргументы) и что она отдаёт(возвращаемое значение). Как она устроена внутри — её дело.
- Каждый вызов начинается с чистого листа: переменные функции создаются заново, и от прошлого вызованичего не остаётся.
Параметр — тоже локальная переменная. Когда функцию вызывают, её параметр получает копиюаргумента. Когда функция изменяет свой параметр, она меняет только копию, а переменная в mainостаётся прежней:
#include <stdio.h>
void reset_score(int score) {
score = 0;
}
int main(void) {
int score = 10;
reset_score(score);
printf("%d\n", score);
return 0;
}Эта программа выводит:
10Функция записала в свой параметр score значение 0. Но переменная scoreв main — другая переменная, у которой просто такое же имя, и она осталась равной10.
Итак, правило: значения попадают в функцию через параметры и выходят из неё через return. Есливы хотите, чтобы функция дала вам новое значение, верните его и сохраните там, где вызываете функцию,например score = add_bonus(score, 10);. В уроке об указателях вы узнаете другой способ: как функцияможет изменить переменную того кода, который её вызвал.
Задание
- 1
Программа не компилируется:
mainвыводитbonus, но это параметр функцииadd_bonus, поэтому он существует только внутри функции. Вmain, выше вызова, создайтепеременнуюbonusсо значением10и передайте её в функцию вместо числа10.Тогда программа выведетБонус: 10. - 2
Но счёт по-прежнему
50: функция прибавила бонус только к своей копии. Исправьте это: функциявозвращаетscore + bonus(значит, тип возвращаемого значения —int), аmainсохраняет результат в своей переменной:score = add_bonus(score, bonus);. Программа выводитСчёт: 60.