Найти тему

Основы С++: Знакомство с аргументами и параметрами функций

В прошлой статье мы научились возвращать значения из функций. Мы написали простую программу, которая просила пользователя ввести число и после чего выводила квадрат введенного числа на экран. Для инструкций, которые будут запрашивать число и принимать его с консоли в переменную input, мы использовали отдельную функцию EnterNumber(). Мы вызывали ее через переменную num из функции main(), помещая ее в блок инициализации: int num{EnterNumber()}. Тем самым мы запускали выполнение инструкций внутри EnterNumber и в конце получали прямо в переменную num значение из переменной input, которое функция EnterNumber возвращала. Таким образом, мы получали число от пользователя. А дальше через инструкцию std::cout мы печатали num умноженную саму на себя, получая тем самым квадрат числа.

Выглядело это так:

Сегодня мы усложним задачу. Вторую часть программы, которая печатает квадрат числа, мы поместим в отдельную функцию. Теперь мы будем вызывать две функции внутрь main, каждая из которых будет выполнять свою задачу.

Попробуем реализовать?

-2

Я создал функцию, которая будет печатать текст на английском: "Квадрат вашего числа = (переменная num * num). Но вот беда, как вы видите на скрине моего кода, даже после того, как я вызвал функцию squareNumber() в функцию main, мой компилятор не может определить переменную num, ее для него просто не существует. Хотя в функции main она определена и инициализирована. Что же делать?

Попробуем определить переменную num прямо в функции squareNumber()

-3

Ага, теперь компиляция возможна! Такс, откомпилируем и запустим эту программу!

-4

Вот черт! Ничего не получилось. Наши функции просто не видят друг друга. Функция squareNumber() не получает значение от функции EnterNumber(), с которого она выведет квадратный корень числа. Вместо этого, она выводит переменную num, которую мы инициализировали внутри этой функции.

Что нам поможет исправить ситуацию? Параметры и аргументы функции!

Знакомство с параметрами и аргументами. Их практическое применение

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

Параметр функции — это переменная, которая используется в функции. Работа параметра осуществляется по принципу переменной, которая была определена внутри функции. Отличие параметров в том, что они инициализируются значением, которое предоставляет вызывающая функция.

Параметры определяются в круглых скобках через запятую во время объявления функции.

Значение, которым инициализирует параметр вызывающая функция, называется, аргументом, он так же помещается в круглых скобках.

Рассмотрим на практике работу аргументов и параметров.

-5

Мы создали два параметра в функции numbers() и хотим их напечатать в этой же функции. Смотрите (на скрин с кодом), редактор visual studio определяет их не как переменные, а как параметры. Инициализируем их аргументами с вызывающей стороны!

-6

Такс, допишите этот код в свой редактор и скомпилируйте. Теперь запустите. Смотрите. Мы добавили аргументы в скобках, вызывая функцию number() из функции main()

Функция numbers, будучи вызвана, инициализировала этими аргументами (150, 320), свои параметры int x и int y. Теперь у функции numbers есть значения параметров и она может выполнив инструкции на строках 4-5, напечатать их.

Итак, мы получили с вами инструмент для решения нашей задачи, которую я поставил в самом начале статьи. Попробуем ее решить с помощью аргументов и параметров?

Попробуйте решить нашу задачу самостоятельно и только потом смотрите следующий скрин с моего редактора.

Вот что у нас получилось:

-7

Если у вас не вышло, перепишите этот код себе и, скомпилируйте и запустите, чтобы убедиться, что все работает правильно.

Такс, думаю вы уже проверили код на работоспособность. Теперь время объяснить, что же мы сделали:

1. Функцию EnterNumber мы оставили без изменений. С ней у нас и так было все в порядке, она успешно запрашивала и получала число от пользователя.

2. Мы написали функцию squareNumber добавив ей параметр (int num) в виде целочисленной переменной, в которую она скоро получит аргумент (число от пользователя). Учтите, что squareNumber не поменяла свой тип, он так и остался void (она ничего не возвращает). Она просто получила целочисленный параметр.

3. Мы создали главную функцию main. Прописали условие для вызова функции EnterNumber(), которая отработав, вернет нам число от пользователя прямо в переменную digit. Да, я изменил название переменной. А то слишком много num будет. В следующей инструкции мы, легким движением руки, добавили в вызов функции squareNumber аргумент (digit).

4. Функция squareNumber, приняв вызов из main, начнет исполнять инструкции, перед этим приняв аргумент (digit) и инициализировав им свой параметр (int num). Так как перед этим в digit мы поместили значение полученное от пользователя. Функция squareNumber выведет квадрат числа без ошибок.

Ура! Мы это сделали!

Возможно, вы уже догадались, что мы можем упростить нашу программу с помощью новых знаний! Если вы это еще не сделали, давайте сделаем это вместе?

-8

Что мы сделали? В строке 15 мы написали инструкцию, согласно которой функция EnterNumber() стала аргументом для squareNumber. Как будет выполняться такая инструкция:

  1. main вызовет squareNumber
  2. Чтобы инструкции внутри squareNumber начали выполняться, она должна получить аргумент в параметр int num и инициализировать его.
  3. squareNumber вызовет EnterNumber, чтобы получить от нее аргумент.
  4. EnterNumber запросит и получит от пользователя число и вернет его в squareNumber (сработает инструкция return input).
  5. squareNumber получит аргумент, сможет инициализировать им параметр и выполнить инструкцию печати квадрата числа.
Обратите внимание: правила С++ не регламентируют порядок выполнения (вычисления) аргументов, если в качестве их вы указали больше одного вызова функций.

Например:
____________________________________________________________________________________

int qwer()

{

//какой-то код

}

int asdf()

{

//какой-то код

}

int zxcv(int x, int y)

{

//какой-то код

}

int main()

{

int zxcv(qwer(), asdf());

}

____________________________________________________________________________________

В этом случае, функция zxcv будет вычислять аргументы в произвольном порядке, который зависит от версии компилятора и других факторов. Это называется неуточненным поведением в С++.

Старайтесь использовать в качестве аргументов несколько вызовов функций.

Несмотря на то, что стандарт С++17 описал правила вычисления аргументов, если они являются вызовами функций. Я не буду объяснять эту информацию, так как по моему мнению, она скорее запутает новичка, чем направит на путь истинный.

Если в моих объяснениях здесь или выше, что-то было непонятно, оставляйте вопросы в комментариях!

А на этом сегодня мы закончим. Спасибо, что дочитали до конца.

Оставляйте реакции в виде лайков и комментариев. Подписывайтесь на канал, чтобы не пропустить выход новых материалов.

Наука
7 млн интересуются