Параметры и аргументы
Функции, которые вы писали до сих пор, каждый раз делают одно и то же. print_banner всегдавыводит одни и те же три строки. Но часто нужно, чтобы функция делала почти то же самое, только каждый разнемного иначе: например, вывела строку из 5 дефисов, а потом строку из 20. Такие значения функция получаетчерез параметры:
#include <stdio.h>
void print_line(int length) {
for (int i = 0; i < length; i++) {
printf("-");
}
printf("\n");
}
int main(void) {
print_line(5);
print_line(20);
return 0;
}Эта программа выводит:
-----
--------------------В определении int length в скобках — это параметр: переменная, которую функцияможет использовать в своём теле. Как и у любой переменной, у него есть тип данных и имя, только без точки сзапятой. Он занимает место слова void, которое означало, что функция ничего не принимает. В вызовезначение в скобках, 5, — это аргумент. Когда вы вызываете функцию, аргументсохраняется в параметре, а затем выполняется тело. При первом вызове length равен 5,при втором — 20.
Эти два слова легко перепутать, поэтому запомните: параметр — это переменная в определении,аргумент — это значение в вызове. Аргументом может быть число, переменная или целое выражение,например print_line(width * 2). Теперь вы знаете и что такое "Привет!\n" вprintf("Привет!\n"): это аргумент функции printf.
У функции может быть несколько параметров, через запятую. У каждого параметра свой тип данных, даже еслитипы одинаковые: int home, int away, а не int home, away. Аргументы попадают впараметры по порядку: первый аргумент — в первый параметр, второй — во второй и так далее:
#include <stdio.h>
void print_score(int home, int away) {
printf("Счёт: %d:%d\n", home, away);
}
int main(void) {
print_score(2, 1);
print_score(0, 3);
return 0;
}Эта программа выводит:
Счёт: 2:1
Счёт: 0:3C проверяет, что аргументы подходят параметрам. Каждому параметру нужен свой аргумент. Если в первом вызовенаписать только print_score(2);, программа не скомпилируется:
main.c:8:18: error: too few arguments to function call, expected 2, have 1
8 | print_score(2);
| ~~~~~~~~~~~ ^
main.c:3:6: note: 'print_score' declared here
3 | void print_score(int home, int away) {
| ^ ~~~~~~~~~~~~~~~~~~
1 error generated.В первой строке сказано, что в вызове слишком мало аргументов: функция ожидает 2, а в вызове 1. Строкаnote ниже показывает, где определена функция. Если аргументов слишком много, в сообщении будетtoo many arguments to function call.
Тип каждого аргумента тоже должен подходить параметру. Текст там, где нужно число, напримерprint_score("два", 1), не скомпилируется. А вот десятичное число для параметра типа intмолча обрезается до целого: print_score(2.7, 1) выводит Счёт: 2:1. А если поменятьместами два аргумента одного типа, компилятор не заметит этого совсем: print_score(1, 2) простовыведет другой счёт. Поэтому всегда проверяйте порядок аргументов.
Теперь понятно, почему для функции без параметров мы пишем (void). Приvoid greet(void) вызов greet(5) — это ошибка:too many arguments to function call, expected 0, have 1. С пустыми скобками,void greet(), C пропустил бы такой вызов. Пустые скобки вы будете встречать в чужих программах,но (void) надёжнее.
Задание
- 1
Выше
mainнапишите функциюprint_rowс двумя параметрами:symbolтипаcharиcountтипаint. Она ничего не возвращает. Она выводитsymbolстолько раз, сколько указано вcount, всё в одной строке: в циклеforвыводите только символ (через%c), а строку закончите после цикла. - 2
В
mainвызовитеprint_row('*', 5), а затемprint_row('#', 3).Программа выводит*****и###. - 3
Аргументом может быть и переменная. Под двумя вызовами напишите цикл
for, в которомiидёт от1до4и который вызываетprint_row('*', i). Накаждом проходе цикла функция получает другой аргумент, поэтому программа рисует треугольник:* ** *** ****