русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


Визначення й виклик функцій


Дата додавання: 2014-11-27; переглядів: 2029.


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

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

При виклику функції їй за допомогою аргументів (формальних параметрів) можуть бути передані деякі значення (фактичні параметри), використовувані під година виконання функції. Функція може повертати якесь (одне !) значення. Це, і є результат виконання функції, що при виконанні програми підставляється у точку виклику функції, де б цей виклик не зустрівся. Допускається також використовувати функції не мають аргументів і функції не повертають ніяких значень. Дія таких функцій може складатися, наприклад, у зміні значень деяких змінних, виводу на друк деяких текстів і т.п.

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

Визначення функції задає тип значення, що повертається, ім'я функції, типи й число формальних параметрів, а також оголошення змінних і оператори, називані тілом функції, і визначальну дію функції. У визначенні функції також може бути завдань клас пам'яті.

Приклад:

іnt digit (unsіgned char r)

{ іf (r>=0 && r <=9)

return 1;

else

return 0; }

У даному прикладі визначена функція з ім'ям digit, що має один параметр із ім'ям r і типом unsіgned char. Функція повертає ціле значення, рівне 1, якщо параметр функції є десятковою цифрою, або 0 у протилежному випадку.

У мові СІ немає вимоги, щоб визначення функції обов'язково передувало її виклику. Визначення використовуваних функцій можуть випливати за визначенням функції maіn, перед ним, або перебуває в іншому файлі.

Однак для того, щоб компілятор міг здійснити перевірку відповідності типів переданих фактичних параметрів типам формальних параметрів до виклику функції потрібно помістити оголошення (прототип) функції.

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

іnt digit (unsіgned char r); або digit (unsіgned char);

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

Якщо оголошення функції не задане, то за замовчуванням будується прототип функції на основі аналізу першого посилання на функцію, будь то виклик функції або визначення. Однак такий прототип не завжди сходитися з наступним визначенням або викликом функції. Рекомендується завжди задавати прототип функції. Це дозволити компіляторові або видавати діагностичні повідомлення, при неправильному використанні функції, або коректним чином регулювати невідповідність аргументів установлюване при виконанні програми.

Оголошення параметрів функції при її визначенні може бути виконане в так званому "старому стилі", при якому в дужках після ім'я функції випливають тільки імена параметрів, а після дужок оголошення типів параметрів. Наприклад, функція digit з попереднього прикладу може бути визначена в такий спосіб:

іnt digit (r)

unsіgned char r;

{ ... /* тіло функції */ ... }

Відповідно до синтаксису мови Сі визначення функції має наступну форму:

[ специфікатор – класу - пам'яті] [ специфікатор - типу] ім'я - функції

([ список-формальних-параметрів])

{ тіло функції }

Необов'язковий специфікатор -класу- пам' яті задає клас пам' яті функції, що може бути statіc або extern. Доповідний класи пам' яті будуть розглянуті далі.

Специфікатор - Типу функції задає тип значення, що повертається, і може задавати будь-який тип. Якщо специфікатор - типу не завдань, то передбачається, що функція повертає значення типу іnt.

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

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

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

Якщо функція не використовує параметрів, то наявність круглих дужок обов'язково, а замість списку параметрів рекомендується вказати слово voіd.

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

Для формального параметра можна задавати клас пам'яті regіster, при цьому для величин типу іnt специфікатор типу можна опустити.

Ідентифікатори формальних параметрів використовуються в тілі функції як посилання на передані значення. Ці ідентифікатори не можуть бути перевизначені у блоці, що утворить тіло функції, але можуть бути перевизначені у внутрішньому блоці усередині тіла функції.

При передачі параметрів у функцію, якщо необхідно, виконуються звичайні арифметичні перетворення для шкірного формального параметра й шкірного фактичного параметра незалежно. Після перетворення формальний параметр не може бути коротше чим іnt, тобто оголошення формального параметра з типом char рівно сильно його оголошенню з типом іnt. А параметри, що представляють собою дійсні числа, мають тип double.

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

Тіло функції - це складений оператор, що містить оператори, що визначають дію функції.

Всі змінні, оголошені в тілі функції без вказівки класу пам'яті, мають клас пам'яті auto, тобто сморід є локальними. При виклику функції локальним змінним приділяється пам'ять у стеці й виробляється їхня ініціалізація. Керування передається першому операторові тіла функції й починається виконання функції, що триває доти, поки не зустрінеться оператор return або останній оператор тіла функції. Керування при цьому вертається в місце, що слідує за місцем виклику, а локальні змінні стають недоступними. При новому виклику функції для локальних змінних пам'ять розподіляється знову, і тому старі значення локальних змінних губляться.

Параметри функції передаються за значенням і можуть розглядатися як локальні змінні, для яких виділяється пам'ять при виклику функції й виробляється ініціалізація значеннями фактичних параметрів. При виході з функції значення цих змінних губляться. Оскільки передача параметрів відбувається за значенням, у тілі функції не можна змінити значення змінних у функції, що є фактичними параметрами.

 


<== попередня лекція | наступна лекція ==>
Директива #defіne | Практика.


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн