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

  Юрій  | 

  Оновл. 4 Вер 2021  | 

 806

Ви вже знаєте, що кожна програма повинна містити функцію 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 Зірок (15 оцінок, середня: 4,73 з 5)
Loading...

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

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