Возвращаемые значения
Функция print_line из предыдущего упражнения только выводит, и всё. А если нужно продолжитьвычисления с результатом, например сложить площади всех комнат в квартире? Выведенное значение видно только ввыводе, и программа дальше с ним работать не может.
Поэтому функции могут возвращать значение. Инструкция return отправляет значениеобратно, в то место, откуда функцию вызвали. Тогда перед именем функции вместо void пишут типданных возвращаемого значения:
#include <stdio.h>
int add(int a, int b) {
return a + b;
}
int main(void) {
int result = add(2, 3);
printf("%d\n", result);
return 0;
}Эта программа выводит:
5Вызов add(2, 3) запускает функцию, и функция возвращает 5. Можно представить, чтовызов заменяется возвращённым значением, так что int result = add(2, 3); превращается вint result = 5;. Значение, которое функция отдаёт обратно, называется еёвозвращаемым значением, а его тип, здесь int, — типом возвращаемогозначения. Функция может возвращать и double, и char, и bool:
#include <stdio.h>
double average(int a, int b) {
return (a + b) / 2.0;
}
int main(void) {
printf("%.2f\n", average(7, 8));
printf("%.2f\n", average(3, 4));
return 0;
}Эта программа выводит:
7.50
3.50Обратите внимание на 2.0: с 2 было бы целочисленное деление, иaverage(3, 4) вернула бы 3.00.
Вызов можно использовать везде, где можно написать значение: сразу вывести его, вычислять с ним илипоставить в условие:
#include <stdio.h>
int add(int a, int b) {
return a + b;
}
int main(void) {
printf("%d\n", add(2, 3));
int total = add(2, 3) * 2;
printf("%d\n", total);
if (add(2, 3) > 4) {
printf("Больше 4\n");
}
return 0;
}Эта программа выводит:
5
10
Больше 4В printf("%d\n", add(2, 3)) программа сначала вызывает add(2, 3), а затем выводит5, которое вернула функция. В add(2, 3) * 2 вызов превращается в 5, а5 * 2 — это 10.
Теперь вы понимаете и что значит int перед main: main тоже возвращаетцелое число. Она возвращает его тому, кто запустил программу, а 0 означает, что программазавершилась благополучно. Это и есть работа строки return 0; в конце main.
Функция, которая не void, обещала вернуть значение, значит, она должна его вернуть. Забытьreturn — частая ошибка. Эта функция выводит сумму, но не возвращает её:
#include <stdio.h>
int add(int a, int b) {
printf("%d\n", a + b);
}
int main(void) {
int result = add(2, 3);
printf("%d\n", result);
return 0;
}Программа не компилируется:
main.c:5:1: error: non-void function does not return a value [-Werror,-Wreturn-type]
5 | }
| ^
1 error generated.Сообщение об ошибке указывает на } в конце функции и говорит, что non-void функция (то естьфункция, которая не void) не возвращает значение. В других местах компиляторы часто лишьпредупреждают об этом, а здесь это ошибка, так что её не пропустить. Исправить можно так:return a + b; вместо printf.
Задание
- 1
Программа не компилируется: ошибка
call to undeclared function 'rectangle_area'говорит,что такой функции ещё нет. Напишите её на месте комментария: у неё два параметра типаint,widthиheight, и она возвращаетwidth * height. Тогда программа выведетКухня: 12иСпальня: 20. - 2
В квартире есть ещё и гостиная размером 6 × 5 метров. В конце
main, передreturn 0;, создайте переменнуюliving_roomс её площадью, вычисленной с помощью функцииrectangle_area. Затем выведите площадь всей квартиры,kitchen + bedroom + living_room,с подписью:Вся квартира: 62. - 3
Новый пол стоит 12,50 за квадратный метр. Выше
mainнапишите функциюfloor_priceс параметромareaтипаint, которая возвращает цену пола,area * 12.5, какdouble. В концеmainвыведите цену пола для всей квартирыс двумя знаками после запятой:Пол: 775.00.