§ 6. Функции

§ 6.1 Объявление, определение, вызов

До этого момента мы только пользовались уже готовыми функциями. Создадим свою. Она будет называться 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)! × 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;
}

§ 6.2 Переменное количество аргументов

Заголовочный файл <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

§ 6.3 Функция main()

До этого момента у функции 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

В своей программе вы можете любым способом использовать и обрабатывать входящие аргументы.

14 июня