Урок 13. Параметры и аргументы функций

   ⁄ 

 Обновлено 17 Апр 2017

  ⁄   

⁄  6

В предыдущем уроке вы узнали, что функция может возвращать значение обратно в caller через return.

Параметры и аргументы функций

Во многих случаях полезно передавать информацию для вызываемой функции, чтобы она могла обработать данные. Например, если мы хотим написать функцию умножения двух чисел, нам нужен способ сказать функции при её вызове, что это будут за числа. В противном случае, как она узнает, что нужно умножать? Это осуществимо с помощью параметров и аргументов.

Параметры функций – это переменные, которые указываются при объявлении функции между круглыми скобками. Если параметров много, то они перечисляются через запятую.

Вот примеры функций с разным числом параметров:

Аргумент – это значение, которое указывается при вызове функции в программе:

Обратите внимание, что аргументы также перечисляются через запятую. Количество аргументов должно совпадать с количеством параметров, иначе компилятор выдаст сообщение об ошибке.

Слаженная работа параметров и аргументов

Так как все параметры являются переменными, то их значениями стают аргументы. И каждый аргумент (значение) копируется в параметр (переменную). Этот процесс называется передачей по значению (pass by value).

Например:

При вызове функции printValues() аргументы 6 и 7 занимают соответственные параметры х и у. То есть, параметру х присваивается значение 6, а параметру у значение 7.

Результат:

6
7

Слаженная работа параметров и возвращаемых значений

С помощью параметров и возвращаемых значений, мы можем создавать функции, которые могут принимать входные данные, проводить с ними операции и возвращать готовое значение назад.

Ниже приведен пример очень простой функции, которая добавляет два числа и возвращает их сумму:

При вызове функции add(), параметру х мы присвоили значение 4, а параметру у — 5.

Затем функция add() вычисляет результат от операции сложения двух чисел — х + у (в данном случае результатом будет 9) и возвращает его обратно в функцию main(). Затем уже происходит вывод с помощью cout.

Результат:

9

Другие примеры

Давайте рассмотрим еще несколько вызовов функций:

Результатом этой программы будет следующее:

9
6
15
10
7
6

Первые два вызова понятные.

В третьем, параметрами являются выражения, которые сначала нужно вычислить. 1 + 2 равно 3, значит значение 3 передается переменной х. 3 * 4 равно 12, значит 12 передается переменной у. Сама функция add (3, 12) вычисляется в значение 15.

Следующая пара относительно легкая:

Здесь уже х = а и у = а. Так как, а = 5, значит add(а, а) = add (5, 5). Результат — 10.

Теперь давайте рассмотрим вызов сложнее:

При выполнении этой инструкции процессор должен определить, какие значения будут у параметров х и у функции add(). З параметром х понятно – мы передаем значение 1 (х=1). А вот чтобы понять, какое значение будет в параметра у, нам необходимо сделать операцию умножения — multiply(2, 3). Процессор присваивает z = 2, w = 3 и результатом (2, 3) будет 6 (y=6). Дальше add(1, 6) возвращает число 7, которое затем передается в cout для вывода.

Меньше слов (символ => используется для улучшения наглядности действий):

add(1, multiply(2, 3)) => add(1, 6) => 7

Последний вызов функции может показаться сложным из-за двойного вызова add(), еще и в качестве параметра:

Но здесь точно так же, как и в описанном выше случае. Перед тем как CPU вычислит внешний вызов функции add(), он должен обработать внутренний вызов add(2, 3). add(2, 3) будет 5. Дальше процессор обрабатывает функцию add (1, 5), в которой результат — 6. Значение 6 передается в cout.

Меньше слов:

add(1, add(2, 3)) => add(1, 5) => 6

Вывод

Параметры являются ключевым механизмом, с помощью которого функции могут повторно использоваться много раз, это позволяет им выполнять задачи, не зная конкретных входных данных раньше времени. Функции получают входные данные в качестве аргументов при вызове.

Return же позволяет возвращать значения обратно в caller.

Тест

1) Что не так с этим фрагментом кода?

2) Какие две проблемы в этом коде?

3) Что будет результатом данной программы?

4) Напишите функцию с именем doubleNumber(), которая имеет один целочисленный параметр и возвращает в два разы больше число, которое получает.

5) Напишите полноценную программу, которая получает целое число от пользователя (используя cin с урока 11), удваивает его с помощью функции doubleNumber() с задания 4, а затем выводит результат в консоль.

Ответы

Чтобы посмотреть ответ, нажмите мышкой на нужный номер.

Ответ 1

Функция multiply() имеет тип возврата void, что означает, что эта функция не может возвращать значения. Так как она всё равно пытается его вернуть, то мы получим ошибку от компилятора. Функция должна иметь тип int.

Ответ 2

Проблема 1: main() передает один аргумент в multiply(), но multiply() имеет два параметра.
Проблема 2: multiply() вычисляет значение и передает результат в переменную, но не возвращает значение в caller. Так как нет return, а тип возврата int, то мы получим ошибку (в некоторых компиляторах) или неожиданные результаты (в остальных).

Ответ 3

Функция multiply получает параметры x = add(1, 2, 3) и y = 4. Сначала, CPU обрабатывает x = add(1, 2, 3), которое возвращает 1 + 2 + 3, либо x = 6. multiply(6, 4) выйдет 24. Ответ: 24.

Ответ 4

Ответ 5

Примечание: Вы можете придумать и другие решения задания 4 и 5. В С++ есть много способов сделать одно и то же разными, либо похожими способами.

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (41 оценок, среднее: 4,95 из 5)
Загрузка...
Поделиться в:
Подписаться на обновления:

Комментариев: 6

  1. Сергей:

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

    1. Li4ik:

      Спасибо, приятно 🙂

  2. Сергей:

    Нужно добавить на сайте систему (лайк,дизлайк) к коментариям.

    1. Li4ik:

      Ну это уже в перспективе.

  3. Yaroslav:

    Вам нужно после каждого урока приписывать авторство, как сделано в начале, типа: «Материал переведен с сайта LearnCpp.com».
    А то получается, что человек, который зашел просто с поиска на какой либо урок, посчитает Вас автором этого материала, что является ошибочным, так как Вы только переводчик =)

    1. Li4ik:

      По началу так и делал. Но практика такая не прижилась, как видите 🙂

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *