Функції повертають значення

Функції, області видимості змінних, рекурсія.

Функція - це самостійна одиниця програми, створена для вирішення конкретного завдання. Функція в мові С відіграє ту ж роль, що і підпрограми або процедури в інших мовах. Функціями зручно користуватися, наприклад, якщо необхідно обробити один і той же код програми. Як і змінні, функції треба оголошувати (declare). Функцію необхідно оголосити до її використання. Запам'ятайте це просте правило - спочатку оголоси, а потім використовуй.

Основна форма опису (definition) функції має вигляд:

тип <имя функции>(Список параметрів)
тіло функції
>

тип <имя функции>(Список параметрів);

Виклик функції робиться наступним чином:

При виконанні функції так само бути крапка з комою.

Чому треба оголошувати функцію до використання? Справа в тому, що для правильної роботи коду функції машині треба знати тип значення, кількість і типи аргументів. При виклику якої-небудь функції копії значень фактичних параметрів записуються в стек, відповідно до типів зазначеними в її прототипі. Потім відбувається перехід в функцію, що викликається.

Наведемо приклад виклику функції, яка буде друкувати рядок "Викликали функцію" на екран.

/ * Використовуємо свою функцію * /

function1 (); // Виклик функції
>


/ * Опис функції * /
void function1 (void) // Заголовок функції

> // Кінець тіла функції

Результатом роботи програми буде рядок надрукована на екрані.
Зверніть увагу на заголовок в описі функції! Після нього не ставиться крапка з комою.

Директива препроцесора (preprocessor directive) просто вставляє текстовий файл stdio.h в текст нашої програми. Причому вставляє туди де стоїть ця директива. Якщо ви приберете або закоментіруете рядок #include , то програма працювати не буде тому що функція printf () не оголошена. Компілятор просто видасть помилку - Function 'printf' should have a prototype (Функція 'printf' повинна мати прототип).

Зверніть увагу ще на те, що тип значення у нашій функції void (порожньо). Це означає, що функція не повертатиме ніякого значення.

Функції повертають значення.

Давайте розглянемо приклад в якому опишемо дві функції, відповідно оголосимо їх і послідовно викличемо. Але в цьому прикладі для однієї функції ми вкажемо тип значення - int.

/ * Дві наших функції * /

int x; // Оголошуємо змінну x (глобальна змінна)

void main (void)
void function1 (void); // Оголошуємо функцію function1 ()
int function2 (); // function2 () буде повертати значення типу int

x = 10; // Надаємо змінної x значення 10

printf ( "До виклику функції function2 () x одно. \ n", x);

function1 (); // Викликаємо функцію function1 ()
x = function2 (); // Викликаємо функцію function2 ()

printf ( "Після виклику функції function2 () x одно. \ n", x);
>

/ * Опис наших функцій * /

void function1 (void)
printf ( "Зроблений виклик першої функції \ n");
>

int function2 (void)
int y; // Оголошуємо локальну змінну
y = x + 10;

return y; // Повертаємо значення y
>

Тепер давайте подивимося текст програми. Після рядка #include ми оголошуємо глобальну змінну x. Так як x - глобальна змінна, то вона буде видно всім функція нашої програми тобто цієї змінної можуть користуватися всі функції.

У тілі main () ми оголошуємо дві функції, одна з яких може повертати значення типу int. Далі ми присвоюємо змінної x значення 10, так як x це глобальна змінна, то ця змінна буде видна функції main () тобто функція main () може використовувати цю змінну. Після цього присвоєння ми виводимо значення x на екран.
На екрані монітора з'явиться наступний рядок - "До виклику функції function2 () x дорівнює 10".

Зверніть увагу на виклик функції printf () -
printf ( "До виклику функції function2 () x одно. \ n", x);
У рядку після сиволов. варто символ \ n. \ N - керуючий символ він означає, що необхідно перейти на новий рядок.

Далі ми викликаємо функцію function1 (). Ця функція просто виводить рядок "Зроблений виклик першої функції \ n" на екран і так як в рядку стоїть \ n, то буде здійснено перехід на новий рядок.

У наступному рядку x = function2 (); змінна x набуває значення яке поверне функція function2 (). Подивіться на опис функції function2 (). У тілі цієї функції ми оголошуємо змінну y, а далі змінної y ми присвоюємо значення змінної x + 10. Так як x - глобальна змінна (вона видна для функції function2) все буде працювати.

Далі йде рядок return y; за допомогою оператора return ми повертаємо значення змінної y. Запам'ятайте, що якщо функція повертає значення, то в тілі цієї функції обов'язково повинен бути присутнім оператор return (він може бути і не один). Ну так от за допомогою оператора return ми повертаємо значення локальної змінної y в зухвалу функцію main ().

Тепер подивимося тіло функції main () Наступним рядком після x = function2 (); є рядок printf ( "Після виклику функції function2 () x одно. \ n", x); яка виводь значення зміненої змінної x;
На екрані з'явиться рядок - "Після виклику функції function2 () x дорівнює 20".

Функції з параметрами.

Функції мови С можуть мати параметри. Ці параметри передаються в функцію і там обробляються. Ще раз покажемо основну форму опису функції

тип <имя функции>(Список параметрів)
тіло функції
>

У списку параметрів для кожного параметра має бути вказаний тип.
Приклад правильного списку параметрів:
function (int x, char a, float z)
Приклад неправильного списку параметрів:
function (int x, a, float z)

Давайте розглянемо все це на прикладі. Нехай у нас буде функція у якій присутній один параметр x. Функція буде повертати квадрат значення x.

int square (int x)
x = x * x; // Символ * це операція множення
return x;
>

Тепер давайте розглянемо приклад функції, яка буде виводити значення змінної z типу float на екран.

void myout (float z) // Змінна z є формальним параметром.
printf ( "Z =% f", z); //% f - означає, що виводиться число з плаваючою точкою
>

Схожі статті