Урок №15. Функції і оператор return

  Юрій  | 

  Оновл. 14 Кві 2020  | 

 285

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

Функції

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

Програми в C++ працюють схожим чином. Іноді, коли програма виконує код, вона може зіткнутися з викликом функції. Виклик функції — це вираз, який вказує процесору перервати виконання поточної функції і приступити до виконання іншої функції. Процесор “залишає закладку” в поточній точці виконання, а потім виконує функцію, що викликається. Коли виконання функції, що викликається, — завершено, то процесор повертається до “закладки” і відновлює виконання перерваної функції.

Функція, в якій знаходиться виклик, називається викликаючою функцією (англ. “caller“).

Наприклад:

Результат виконання програми вище:

Starting main()
In doPrint()
Ending main()

Ця програма починає виконання з першого рядка функції main(), де виводиться на екран Starting main(). Другий рядок функції main() викликає функцію doPrint(). На цьому етапі виконання стейтментів в функції main() призупиняється і процесор переходить до виконання стейтментів всередині функції doPrint(). Перший (і єдиний) рядок в doPrint() виводить текст In doPrint(). Коли процесор завершує виконання doPrint(), він повертається назад в функцію main() до тієї точки, на якій зупинився. Отже, наступним стейтментом є вивід рядка Ending main() на екран.

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

Правило: Не забувайте вказувати круглі дужки () при виклику функцій.

Значення, що повертаються

Коли функція main() завершує своє виконання, вона повертає цілочисельне значення назад в операційну систему, використовуючи оператор return.

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

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

Розглянемо просту функцію, яка повертає цілочисельне значення:

Результат виконання програми вище:

7
10

Тепер давайте розберемося детальніше:

   Перший виклик функції return7() повертає 7 в викличаючу функцію, де воно потім передається в std::cout для виводу на екран.

   Другий виклик функції return7() знову повертає 7 в викликаючу функцію. Вираз 7 + 3 генерує результат 10, який виводиться на екран.

   Третій виклик функції return7() знову повертає 7 в викликаючу функцію. Проте main() нічого з ним не робить, тому нічого і не відбувається (значення, що повертається, — просто ігнорується).

Примітка: Значення, що повертаються, не виводяться на екран, якщо їх не передавати в об’єкт std::cout. В останньому виклику функції return7() значення не надсилається в std::cout, тому нічого і не відбувається.

Тип повернення void

Функції можуть і не повертати значення. Щоб повідомити компілятору, що функція не повертає значення, потрібно використати тип повернення void. Погляньмо ще раз на функцію doPrint() з прикладу вище:

Ця функція має тип повернення void, який означає, що функція не повертає значення. Оскільки значення не повертається, то і оператор return не потрібен.

Ось ще один приклад використання функції типу void:

У першому виклику функції returnNothing () виводиться Hi!, але нічого не повертається назад в викликаючу функцію. Точка виконання повертається назад в main(), де програма продовжує своє виконання.

Другий виклик функції returnNothing () навіть не скомпілюється. Функція returnNothing() має тип повернення void, який означає, що ця функція не повертає значення. Однак main() намагається відправити це значення (яке не повертається) в std::cout для виведення на екран. std::cout не може опрацювати цей випадок, так як значення на виведення — не надано. Отже, компілятор видасть помилку. Вам потрібно буде закоментувати цей рядок, щоб компіляція пройшла успішно.

Повернення значення функцією main()

Тепер у вас є розуміння того, як працює функція main(). Коли програма виконується, операційна система робить виклик функції main() і починається її виконання. Стейтменти в main() виконуються послідовно. В кінці функція main() повертає цілочисельне значення (зазвичай 0) назад в операційну систему. Тому main() оголошується як int main().

Чому потрібно повертати значення назад в операційну систему? Справа в тому, що значення, що повертається функцією main(), є кодом стану, який повідомляє операційній системі про те, чи успішно було виконання програми чи ні. Зазвичай, значення 0 (нуль) означає що все пройшло успішно, тоді як будь-яке інше значення означає невдачу/помилку.

Зверніть увагу, за стандартами C++ функція main() повинна повертати цілочисельне значення. Однак, якщо ви не вкажете return в кінці функції main(), то компілятор поверне 0 автоматично, якщо ніяких помилок не буде. Проте все ж рекомендується вказувати return в кінці main() і використовувати тип повернення int для функції main().

Детальніше про значення, що повертаються

По-перше, якщо тип повернення функції не void, то вона повинна повертати значення зазначеного типу (використовуючи оператор return). Єдиний виняток — це функція main(), яка повертає 0, якщо не надано інше значення.

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

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

Є способи обійти правило повернення одного значення, але про це буде пізніше у відповідному уроці.

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

Повторне використання функцій

Одну і ту ж функцію можна викликати декілька разів, навіть в різних програмах, що дуже корисно:

Результат виконання програми вище:

Enter an integer: 4
Enter an integer: 9
4 + 9 = 13

Тут main() переривається 2 рази. Зверніть увагу, що в обох випадках, отримане значення від користувача зберігається в змінній x, а потім передається назад в main() за допомогою оператора return, де присвоюється змінній a або b!

Також main() не є єдиною функцією, яка може викликати інші функції. Будь-яка функція може викликати будь-яку іншу функцію!

Результат виконання програми вище:

Starting main()
O
K
Ending main()

Вкладені функції

В С++ одні функції можуть бути оголошені всередині інших функцій (тобто бути вкладеними). Наступний код спровокує помилку компіляції:

Правильно ось так:

Тест

Які з наступних програм не скомпілюються (і чому), а які скомпілюються (і який у них буде результат)?

Програма №1:

Програма №2:

Програма №3:

Програма №4:

Програма №5:

Програма №6:

Програма №7:

Відповіді

Щоб переглянути відповідь, клікніть на неї мишкою.

Відповідь №1

Програма скомпілюється, а результатом виконання буде значення 13.

Відповідь №2

Програма не скомпілюється. Використання вкладених функцій в С++ заборонено.

Відповідь №3

Програма скомпілюється, але не буде ніякого виводу. Значення, що повертаються з функцій, не використовуються в main() і, таким чином, ігноруються.

Відповідь №4

Програма не скомпілюється, так як типом повернення функції printO() є void, а ми відправляємо значення, яке не існує, на вивід. Результат — помилка компіляції.

Відповідь №5

Результатом виконання цієї програми буде:

6
6

Обидва рази, коли викликається функція getNumbers(), повертається значення 6. Компілятор, зустрічаючи перший return, відразу ж виконує повернення цього значення, а все, що знаходиться за першим return-ом, — уже не важливо (ігнорується). Рядок return 8; ніколи не виконується.

Відповідь №6

Програма не скомпілюється через недопустиме ім’я функції.

Відповідь №7

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

Оцінити статтю:

1 Зірка2 Зірки3 Зірки4 Зірки5 Зірок (5 оцінок, середня: 4,60 з 5)
Loading...

Залишити відповідь

Ваш E-mail не буде опублікований. Обов'язкові поля відмічені *