Перейти к содержанию

Лекция 8: Функции

"Чтобы что-то шло тебе в руки, нужно эти руки протянуть. Иначе протянешь ноги."
— Стив Бушеми


Что такое функция?

Функция в языке C представляет собой именованную последовательность операторов, которая может принимать параметры и возвращать значение. Подпрограммы используются для:

  • Уменьшения размера памяти, занимаемой кодом;
  • Разбиения крупных программ на части в соответствии с модульным принципом;
  • Удобства сопровождения, оптимизации и расширения функциональности.

В языке C подпрограммы реализованы в виде функций. Отличие процедур от функций в том, что функции возвращают значение.

Функции:

  • Выделяют дублирующийся код в отдельные блоки;
  • Логически разделяют программу на части;
  • Упрощают управление и тестирование.

Пример функции для сложения двух чисел:

#include <stdio.h>

int sum(int a, int b) {
    return a + b;
}

int main() {
    int result = sum(3, 4);
    printf("Сумма: %d\n", result);
    return 0;
}

Структура функции в C

Функция состоит из:

  1. Заголовка:

    • Указывает тип возвращаемого значения, имя функции и параметры.
  2. Тела функции:

    • Набор инструкций, выполняемых при вызове функции.

Пример:

int add(int a, int b) {
    return a + b;
}

Функции бывают:

  • С фиксированным или переменным числом аргументов;
  • Возвращающие значение или нет (void).

Передача параметров в функцию

По значению

При вызове функции параметры передаются по значению:

#include <stdio.h>

void changeValue(int x) {
    x = 100;
}

int main() {
    int a = 5;
    changeValue(a);
    printf("Значение a: %d\n", a);
    return 0;
}

Чтобы изменить оригинальную переменную, используется передача по указателю:

#include <stdio.h>

void changeValue(int *x) {
    *x = 100;
}

int main() {
    int a = 5;
    changeValue(&a);
    printf("Значение a: %d\n", a);
    return 0;
}

Передача массивов и указателей

Для передачи массива передаётся его имя, интерпретируемое как указатель на первый элемент:

#include <stdio.h>

void printArray(int arr[], int size) {
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

int main() {
    int data[] = {1, 2, 3, 4};
    printArray(data, sizeof(data) / sizeof(data[0]));
    return 0;
}

Функции с переменным числом параметров

Функции с переменным числом параметров реализуются с помощью <stdarg.h>:

#include <stdarg.h>
#include <stdio.h>

int sum(int count, ...) {
    va_list args;
    va_start(args, count);

    int total = 0;
    for (int i = 0; i < count; i++) {
        total += va_arg(args, int);
    }

    va_end(args);
    return total;
}

int main() {
    printf("Сумма: %d\n", sum(4, 1, 2, 3, 4));
    return 0;
}

Рекурсия

Рекурсивная функция вызывает саму себя. Это удобно для задач, разбиваемых на подзадачи. Пример вычисления факториала:

#include <stdio.h>

int factorial(int n) {
    if (n <= 1) return 1;
    return n * factorial(n - 1);
}

int main() {
    printf("Факториал 5: %d\n", factorial(5));
    return 0;
}

Особенности рекурсии

  • Занимает память в стеке.
  • Затраты на выполнение выше, чем у итеративных алгоритмов.
  • Программы с рекурсией более читаемы, но могут приводить к переполнению стека.

Встраиваемые функции

Inline-функции заменяют вызов на её тело для повышения производительности:

#include <stdio.h>

inline int square(int x) {
    return x * x;
}

int main() {
    printf("Квадрат числа 5: %d\n", square(5));
    return 0;
}

Компилятор может отказаться от встраивания, если это ухудшает производительность.


Параметры командной строки

Функция main может принимать параметры командной строки:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
    if (argc != 3) {
        printf("Ошибка: нужно два числа\n");
        return 1;
    }

    int a = atoi(argv[1]);
    int b = atoi(argv[2]);
    printf("Сумма: %d\n", a + b);

    return 0;
}

Заключение

Использование функций в C позволяет структурировать код, уменьшить дублирование и улучшить сопровождение программ. Главное – это правильно организовать взаимодействие функций между собой и с основной программой.


облегчение