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

   | 

   | 

 Обновлено 1 Июн 2018  | 

 15295

 ǀ   21 

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

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

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

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

Например:

Параметры каждой функции действительны только внутри этой функции. Поэтому, если printValue() и add() имеют параметр с именем a, то это не означает, что произойдет конфликт имен. Эти параметры считаются отдельными и никак не взаимодействуют друг с другом.

Аргумент – это значение, которое передается из caller-а в функцию. Указывается в скобках при вызове функции в программе:

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

Как работают параметры и аргументы

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

Например:

При вызове функции printValues() аргументы 8 и 9 соответственно копируются в параметры a и b. Параметру a присваивается значение 8, а параметру b — значение 9.

Результат:



8
9

Как работают параметры и возвращаемые значения

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

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

При вызове функции add(), параметру a присваивается значение 7, а параметру b — 8.

Затем функция add() вычисляет их сумму (a+b) и возвращает результат обратно в main(). Затем уже результат (15) отправляется на вывод в std::cout.

Результат:

15

Еще примеры

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

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

15
20
25
8
7
6

С первыми двумя вызовами всё понятно.

В третьем вызове, параметрами являются выражения, которые сначала нужно обработать. 2+3 равно 5 и значение 5 передается переменной a. 4*5 равно 20 и значение 20 передается переменной b. Результатом выполнения функции add(5, 20) будет значение 25.

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

Здесь уже a=x и b=x. Так как, x=4, то add(x, x) = add(4, 4). Результат — 8.

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

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

Проще говоря:

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

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

Но здесь точно так же, как и в случае выше. Перед тем как процессор вычислит внешний вызов функции add(), он должен обработать внутренний вызов add(2, 3). add(2, 3) будет 5. Дальше процессор обрабатывает функцию add(1, 5), результатом которой является значение 6. Затем 6 передается в std::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 имеет параметры a=add(3, 4, 5) и b=5. Сначала, процессор обрабатывает a=add(3, 4, 5), которое возвращает 3+4+5, т.е. 12. multiply(12, 5) выйдет 60. Ответ: 60.

Ответ 4

Ответ 5

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

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

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

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

  1. Илья:

    Вот тебе,админ, для примера альтернативная программа,ты в ответе предлагал вводить число в консоль,используя функцию main(),я написал альтернативную,где ввод происходит через функцию doubleNumber(),есть ли у такого способа минусы перед твоим,и если да,то какие???Код скомпиллировался,работает как надо.

    1. Илья:

      P.S:
      В таком решении ,когда мы в фукции main вызываем функцию doubleNumber(),её аргументом можно прописать произвольное число при этом считать умножаться будет то число,которое мы пропишем в консоли,а не аргумент.Кстати с аргументом "а" в функции doubleNumber код не компиллируется.

    2. Юрий Юрий:

      Вот беру и смотрю.

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

      У тебя doubleNumber выполняет две задачи: принимает число и умножает его. Для такой простенькой программы, как эта (это даже не программа — 13 строк кода всего лишь), можно использовать и такой, как у тебя вариант, и такой, как у меня, и другие, которые предлагали в комментариях. В более сложных программах оптимальным вариантом было бы сделать отдельную функцию для получения значения от пользователя и отдельную для умножения значения.

  2. Ray:

    У Вас, в примерах к уроку 13 указывается: using namespace std; и дальше везде все равно прописываются std: Корректно ли использование std: в добавок к using namespace std; ? Думаю, что они должны быть взаимоисключающими, я не прав ?

    1. Юрий Юрий:

      Вы правы. Спасибо за бдительность, исправил.

  3. master114:

    Сделал через функции, так сказать с заделом на правильность — http://www.onlinegdb.com/B1-Zzq3hM.

    1. Юрий Юрий:

      Всё правильно и согласно рекомендациям из этого туториала. Радует, что уловили суть и пишите программы с самого начала правильным образом.

  4. Parenochek1488:

    Я какой-то не правильный(

    1. Li4ik Li4ik:

      У вас тут несколько замечаний (по поводу using namespace std и объявления переменных в глобальной области видимости). Продолжайте читать уроки — постепенно всё узнаете и сами поймете, что у вас не так.

      1. Parenochek1488:

        Никак не могу запомнить, как работают параметры. Это решение единственное, которое пришло на ум. Но, как по мне, главное, что оно работает и введённое "a" умножается на два. Но урок я явно не усвоил, так что буду пробовать ещё. Спасибо за такой удобный сайт.

        1. Li4ik Li4ik:

          Пожалуйста. По поводу параметров есть не один урок, всё, что нужно — рассматривается.

  5. Семён:

    Спасибо ! Но по мне так лучше пока все поэтапно Но их плюс в том , что их можно повторять много раз .

  6. Александр:

    Для чего костыли с std:: ? Если можно реализовать все быстрее без него с помощью using namespace std;.

  7. Дарья:

    Все прекрасно! Спасибо Вам! Не думала, что когда-нибудь возьмусь за изучение и что моей головы на это хватит! Написала решение к 5 заданию и какого было мое удивление когда она заработала!))

    1. Li4ik Li4ik:

      Никогда не знаешь, пока не попробуешь 🙂

  8. Сергей:

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

    1. Li4ik Li4ik:

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

  9. Сергей:

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

    1. Li4ik Li4ik:

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

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

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

ПОДПИСЫВАЙТЕСЬ

НА КАНАЛ RAVESLI В TELEGRAM

@ravesli

ПОДПИСАТЬСЯ БЕСПЛАТНО