Вывести или вернуть?
Новички часто путают return и printf, потому что оба как будто выдают значение. Ноделают они очень разное:
printfтолько показывает вам значение в выводе. Программа не может работать с тем, что быловыведено.returnотдаёт значение программе, которая может сохранить его в переменной, вычислять с нимили вывести.
Посмотрите, что происходит, когда функция выводит результат вместо того, чтобы вернуть его, а программапотом хочет с ним вычислять:
#include <stdio.h>
void print_sum(int a, int b) {
printf("%d\n", a + b);
}
int main(void) {
int result = print_sum(2, 3);
printf("%d\n", result * 2);
return 0;
}Программа не компилируется:
main.c:8:9: error: initializing 'int' with an expression of incompatible type 'void'
8 | int result = print_sum(2, 3);
| ^ ~~~~~~~~~~~~~~~
1 error generated.Сообщение об ошибке говорит, что переменную типа int нельзя инициализировать выражением типаvoid. Функция print_sum — void, поэтому она не возвращает ничего, что можнобыло бы сохранить; она только выведет 5. С print_sum(2, 3) * 2 всё закончится так же,только с ошибкой invalid operands to binary expression ('void' and 'int'): вычислять с «ничем»нельзя.
Исправить можно так: заменить void на int и вернуть значение вместо того, чтобывыводить: return a + b;.
Бывает и наоборот: функция возвращает значение, но никто его не использует. Если в main написатьтолько add(2, 3);, программа ничего не выведет. Функция вернула 5, но программа несохранила и не вывела это значение, поэтому оно потерялось. Чтобы увидеть его, выведите его:printf("%d\n", add(2, 3));.
Так когда же функции выводить, а когда возвращать? Функция, которая что-то вычисляет, должна вернутьрезультат. А код, который её вызывает, решит, что с ним делать: вывести, сохранить или продолжить вычислять.Выводить внутри функции стоит только тогда, когда вывод — вся её работа, как у greet илиprint_row. У таких функций часто имена начинаются с print_, чтобы их можно былоотличить с первого взгляда.
Задание
- 1
Пицца стоит 9, а напиток — 3. Функция
order_priceдолжна вычислять цену заказа, но она лишьвыводит цену, поэтому программа не компилируется. Исправьте функцию так, чтобы она возвращала цену, а невыводила её. Тогда программа выведетВместе: 63. - 2
Последний вызов в
main,order_price(1, 1);, должен показать цену маленькогозаказа. Но сейчас он ничего не показывает: функция возвращает цену, а никто её не использует. Выведите её сподписью:Маленький заказ: 12.