мета-данные страницы
  •  

Это старая версия документа!


функции

Процедура - такая ф-я, которая имееет побочный эффект (те затрагивает части программы за пределами себя) и, как правило, ничего не возвращает.
// определение функции
возвращаемый_тип имя_функции(параметры) {
    выполняемые_инструкции;
}
 
// вызов функции
имя_функции(параметры);

Прототип или описание функции

Функция должна быть определена до ее вызова. Большенство компиляторов не скомпилирует данный код:

#include <stdio.h>
 
int main(void){
  hello(); // вызов до определения - ошибка
  return 0;
}
 
void hello(){
  printf("Hello!\n");
}

Для определения функции после ее вызова сущевствуют прототипы функций:

#include <stdio.h>
 
// прототип
void hello(void);
 
int main(void){
  hello();
  return 0;
}
 
// определение
void hello(){
  printf("Hello!\n");
}

Таким образом компилятор, на момент вызова ф-ии, уже будет знать о ней.

Параметры

// функция принимает массив символов
void print_message(char message[]){
  printf("%s\n", message);
}
 
// прототип выглядил бы так
void print_message(char[]);

если параметров несколько, они перечисляются через запятую

параметры ф-ии можно изменять1) в теле функции

параметры могут иметь те же модификаторы, что и обычные переменные

{{fixme}} НАПИСАТЬ О ПЕРЕДАЧЕ ПРИ КОПИРОВАНИИ И ПЕРЕДАЧЕ ПО УКАЗАТЕЛЮ

Возвращаемые значения

Функция может иметь результат - некоторое значение, которое оно возвращает во внешний код.

void sum1(int x, int y){
  printf("%d + %d = %d \n", x, y,  x + y);
}
 
// аналогично sum1
void sum2(int x, int y){
  printf("%d + %d = %d \n", x, y,  x + y);
  return;
}
 
// возвращает int
int sum3(int x, int y){
  return x + y;
}
 
int result = sum(x, y);

В тех функциях, которые не возвращают никакого значения в качестве возвращаемого типа используется void. Если такой ф-ии явно не указать пустой return; - компилятор сам подставит его.

При вызове return функция завершаеться, даже если после return есть еще код

Рекурсия

функция может вызывать саму себя прямо в теле

int factorial(int n) {
  if (n == 1) {
    return 1;
  }
  return n * factorial(n - 1);
}
1)
При компиляции функции для ее параметров выделяются отдельные участки памяти. Передаеться только значение