До этого момента мы только пользовались уже готовыми функциями. Создадим свою. Она будет называться sqr(). В круглых скобках через запятую указываются аргументы функции и их типы. Перед функцией указывается тип возвращаемого значения. Тело (в нашем случае содержащее одно выражение, вычисляющее и возвращающее квадрат числа) помещается в фигурные скобки.
Вызывается эта функция, как и любая другая, указанием её имени и перечислением аргументов в скобках.
#include <stdio.h>
int sqr(int x)
{
return x * x;
}
int main()
{
int result = sqr(5);
printf("%d", result);
return 0;
}
Тело функции не обязано находиться раньше функции main(). Сперва можно разместить прототип функции (указывать имена аргументов необязательно), а уже потом — её тело. Позднее мы воспользуемся таким фактом и усовершенствуем этот способ.
#include <stdio.h>
int sqr(int x); // Объявление (прототип).
int main()
{
int result = sqr(5);
printf("%d", result);
return 0;
}
int sqr(int x) // Определение.
{
return x * x;
}
Следующая функция распечатывает то число, которое ей передали. Она ничего не возвращает, поэтому мы указали void.
void print(int x)
{
printf("%d", x);
}
В принципе, можно написать return в том месте, где осуществляется выход из функции.
void print(int x)
{
printf("%d", x);
return;
}
Функция может не иметь аргументов.
void hello()
{
puts("Hello!");
}
Тогда в скобках можно указать void.
void hello(void)
{
puts("Hello!");
}
Функции могут быть рекурсивными. К примеру, факториал \(n!=(n-1)!\times n\).
#include <stdio.h>
int factorial(int n);
int main()
{
printf("%d", factorial(5)); // 120
return 0;
}
int factorial(int n)
{
if (n == 0 || n == 1)
{
return 1;
}
return factorial(n - 1) * n;
}
Заголовочный файл stdarg.h предоставляет возможность упростить себе работу с функциями, у которых переменное количество аргументов.
int sum(int num, ...)
{
va_list args; // Список аргументов.
va_start(args, num); // Первый аргумент.
int sum = 0;
while (num--)
{
sum += va_arg(args, int); // Следующий аргумент.
}
va_end(args);
return sum;
}
Однако первым аргументом нужно передавать количество переменных аргументов.
printf("%d", sum(7, 2, 3, 5, 7, 11, 13, 17)); // 2 + 3 + 5 + 7 + 11 + 13 + 17 = 58
До этого момента у функции main() мы не указывали никаких аргументов.
int main(void)
...
int main()
...
Некоторые компиляторы позволяют считать, что эта функция не возвращает значение (void).
void main(void)
...
Однако есть вариант с двумя аргументами (второй может оформляться иначе).
int main(int argc, char *argv[])
...
Это способ передать программе аргументы. Откройте в консоли директорию с исполняемым файлом, наберите её название и напишите несколько аргументов.
> myprog.exe -a -b
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("%d\n", argc);
for (int i = 0; i < argc; ++i)
{
printf("%s\n", argv[i]);
}
return 0;
}
Аргумент argc содержит количество переданных аргументов. Их не может быть меньше одного, первым всегда идёт путь к исполняемому файлу. Аргумент argv (который на самом деле является массивом указателей, хоть мы ещё не рассматривали такие понятия), содержит сами передаваемые строки.
3
myprog.exe
-a
-b
В своей программе вы можете любым способом использовать и обрабатывать входящие аргументы.