return завершает функцию
return делает сразу два дела: возвращает значение и тут же завершает функцию. Остальная частьфункции не выполняется:
#include <stdio.h>
int add(int a, int b) {
return a + b;
printf("Эта строка никогда не выполнится.\n");
}
int main(void) {
printf("%d\n", add(2, 3));
return 0;
}Эта программа выводит:
5Строка после return не выполняется никогда, потому что функция уже завершилась.
Это удобно вместе с условиями. Эта функция возвращает большее из двух чисел:
#include <stdio.h>
int max(int a, int b) {
if (a > b) {
return a;
}
return b;
}
int main(void) {
printf("%d\n", max(7, 3));
printf("%d\n", max(2, 9));
return 0;
}Эта программа выводит:
7
9Для max(7, 3) условие 7 > 3 истинно, поэтому функция возвращает 7 и наэтом завершается: последняя строка не выполняется. Для max(2, 9) условие ложно, тело ifпропускается, и функция доходит до return b;, то есть возвращает 9. else ненужен: как только выполнился return, остальная часть функции всё равно пропускается. (Сelse функция работала бы так же.)
Когда условий несколько, их порядок важен, потому что побеждает первый выполнившийся return. Этафункция даёт игроку 3, 2 или 1 звезду за набранные очки:
#include <stdio.h>
int stars(int points) {
if (points >= 90) {
return 3;
}
if (points >= 50) {
return 2;
}
return 1;
}
int main(void) {
printf("%d\n", stars(95));
printf("%d\n", stars(60));
printf("%d\n", stars(20));
return 0;
}Эта программа выводит:
3
2
1При 95 очках первое условие истинно, поэтому функция возвращает 3. При 60 очках первоеусловие ложно, а второе истинно: 2. При 20 очках ни одно условие не истинно, поэтому функция доходитдо последней строки и возвращает 1. Если бы функция сначала проверяла points >= 50,то 95 очков давали бы только 2 звезды, потому что 95 — это тоже не меньше 50.
Следите за последним return. Функция, которая не void, должна вернуть значение прилюбом исходе условий. Без строки return 1; функции нечего было бы вернуть при 20 очках, ипрограмма не скомпилировалась бы:error: non-void function does not return a value in all control paths. Конец сообщения,in all control paths, означает «при любом ходе выполнения»: компилятор заметил, что один из путей через функциюдоходит до её конца без return.
В функции void можно написать return; без значения. Тогда функция простозавершается. Это полезно, когда функция должна остановиться раньше, потому что не может выполнить своюработу:
#include <stdio.h>
void print_division(int a, int b) {
if (b == 0) {
printf("На ноль делить нельзя.\n");
return;
}
printf("%d\n", a / b);
}
int main(void) {
print_division(10, 2);
print_division(10, 0);
return 0;
}Эта программа выводит:
5
На ноль делить нельзя.Задание
- 1
Функция
ticket_priceвозвращает цену билета в зоопарк для посетителя заданного возраста.Пока она возвращает200для всех. Выше строкиreturn 200;добавьте условия: дети младше6 лет проходят бесплатно (0), а посетители младше 18 лет платят100. Тогда программавыведет0,100и200. - 2
Пенсионеры в возрасте от 65 лет тоже платят
100. Добавьте в функцию условие для них, а вконцеmain, передreturn 0;, выведитеticket_price(70). Программавыведет ещё одно100.