Чем отличаются параметры и аргументы функций
Динамические значения, которые передаются в JavaScript-функцию, могут меняться при вызове этой функции в разных местах кода. Мы называем эти данные параметрами и аргументами, причем не все хорошо помнят, чем одни отличаются от других.
В этой статье мы рассмотрим, что собой представляют параметры и аргументы функций и когда какое слово использовать.
Функции в JavaScript
Функция — один из фундаментальных строительных блоков в программировании на JavaScript. Это блок кода, созданный для выполнения определенной задачи.
Функции — переиспользуемый код: его можно применять где угодно в программе. Благодаря им отпадает необходимость в бесконечном повторении одинакового кода в разных местах.
Вот пример функции без всяких параметров и аргументов:
Сначала идет объявление функции add . Затем она вызывается (последняя строчка кода). Результат работы этой функции — число 5.
Но вся красота функций раскрывается, когда мы передаем в них какие-нибудь значения.
Как использовать параметры и аргументы в функции
Давайте рассмотрим следующий код:
Если сравнивать с функцией из предыдущего примера, здесь мы ввели x и y , а числа 2 и 3 написали в другом месте. Вот эти x и y — параметры функции add , а 2 и 3 — аргументы.
Параметр — это одна из переменных в функции. Данные, которые вы передаете в параметры функции при ее вызове, называются аргументами.
Когда функция add вызывается с аргументами 2 и 3 (в коде — add(2, 3) ), числа 2 и 3 присваиваются параметрам x и y соответственно. То есть в этой функции x будет заменен на 2, а y — на 3.
Если функция вызывается с другими аргументами, x и y получают другие значения. Параметры — это своего рода плейсхолдеры для аргументов функции.
Мощь аргументов
Благодаря аргументам функции становятся более пригодными для повторного использования. В частности, аргументы позволяют более эффективно применять одни функции внутри других.
function add(x, y) < return x + y >function multiply(a, b, c) < // a = 1, b = 2, c = 3 const num1 = add(a, b) // num1 = add(1, 2) = 3 const num2 = add(b, c) // num2 = add(2, 3) = 5 return num1 * num2 // 15 >multiply(1, 2, 3) // возвращает 15
У первой функции, add() , есть два параметра, x и y . Эта функция возвращает сумму двух параметров.
Вторая функция, multiply() , имеет три параметра, a , b и c . Внутри этой функции объявляются две переменные, num1 и num2 . Переменная num1 будет хранить результат работы функции add(a, b) , а num2 — результат add(b, c) . В конечном итоге функция multiply вернет значение num1 , умноженное на значение num2 .
Функция multiply вызывается с тремя аргументами — 1, 2 и 3.
add(a, b) превращается в add(1, 2) и возвращает 3.
add(b, c) превращается в add(2, 3) и возвращает 5.
После этого переменная num1 получает значение 5, а num2 — 5.
Аргументы, переданные в функцию multiply , используются также как аргументы для функции add .
От редакции Techrocks. Также предлагаем почитать:
Заключение
Если вы только начинаете знакомиться с функциями, использование параметров и аргументов может быть для вас не слишком интуитивным. Но если сразу хорошенько вникнуть в то, что собой представляют функции и как они работают, проблем с параметрами и аргументами у вас не будет.
Языки программирования параметры функции
Через параметры в функцию можно передать различные значения. Параметры перечисляются после имени функции через запятую в скобках:
(тип_параметра1 имя_параметра1, тип_параметра2 имя_параметра2, . тип_параметраN имя_параметраN)
Для каждого параметра указывается его тип и имя.
Например, определим и вызовем функцию, которая выводит на консоль имя и возраст человека:
#include void print(std::string name, unsigned age) < std::cout int main() < print("Tom", 38); // Name: Tom Age: 38 >
При запуске программы мы получим следующий консольный вывод:
Функция print() принимает два параметра и выводит на консоль их значения. Первый параметр называется name и представляет тип std::string . А второй параметр называется age и представляет тип unsigned int . И при вызове функции для этих параметров необходимо передать значения
Значения, передаваемые параметрам функции при ее вызове, называются аргументами. В данном случае в качестве аргументов передаются строковый и целочисленный литералы. При этом аргументы передаются по позиции, то есть первый аргумент (строка «Tom») передается первому параметру (параметру name), второй аргумент (число 38) — второму параметру (параметру age) и так далее.
При этом аргументы должны соответствовать параметрам по типу или допускать неявно преобразование в тип параметра. Так, в примере выше параметру name передается строковый литерал, который автоматически преобразуется в тип std::string .
Подобным образом можно передавать в параметрам не только литералы, но и, например, значения переменных и констант:
#include void print(std::string name, unsigned age) < std::cout int main() < const std::string userName ; unsigned userAge ; print(userName, userAge); // Name: Bob Age: 42 >
При вызове функции здесь параметр name получит значение константы userName, а параметр age — значение переменной userAge.
При использовании прототипа функции прототип после имени функции в скобках должен содержать типы параметров:
#include void print(std::string, unsigned); // прототип функции print int main() < print("Sam", 28); // Name: Sam Age: 28 >void print(std::string name, unsigned age)
Опционально в прототипе можно указывать имена параметров:
void print(std::string name, unsigned age); // прототип
Аргументы по умолчанию
Функция может принимать аргументы по умолчанию, то есть некоторые значения, которые функция использует, если при вызове для параметров явным образом не передается значение:
#include void print(std::string name, unsigned age = 18) < std::cout int main() < print("Sam"); // Name: Sam Age: 18 print("Tom", 22); // Name: Tom Age: 22 >
Для установки значения по умолчанию параметру присваивается это значение unsigned age = 18 . И если для второго параметра не будет передано значение, то он будет использовать значение по умолчанию. Консольный вывод программы:
Name: Sam Age: 18 Name: Tom Age: 22
При объявлении прототипа подобной функции он тоже может содержать значение по умолчанию для параметра. И в этом случае мы можем не определять в функции значение по умолчанию для параметра — оно будет браться из прототипа:
#include void print(std::string, unsigned = 18); // прототип int main() < print("Sam"); // Name: Sam Age: 18 print("Tom", 23); // Name: Tom Age: 23 >void print(std::string name, unsigned age)
При определении необязательных параметров стоит учитывать, что они должны идти после обязательных. Например, назначим параметру name тоже значение по умолчанию:
#include void print(std::string = «Undefined», unsigned = 18); // прототип int main() < print(); // Name: Undefined Age: 18 print("Sam"); // Name: Sam Age: 18 print("Tom", 23); // Name: Tom Age: 23 >void print(std::string name, unsigned age)
Поскольку здесь параметр name определен как необязательный, то следующий за ним параметр age тоже должен иметь значение по умолчанию.
Автоматическое выведение типа параметров
Стоит отметить, что начиная со стандарта C++20 можно вместо конкретного типа для параметров указывать ключевое слово auto . Тогда тип параметров будет выводиться автоматически на этапе компиляции на основе передаваемых в функцию аргументов:
#include void sum(auto, auto); // прототип функции sum int main() < const int n1; const int n2; sum(n1, n2); // 3 + 4 = 7 const double d1; const double d2; sum(d1, d2);; // 3.3 + 4.4 = 7.7 > void sum(auto a, auto b)
- Глава 1. Введение в С++
- Язык программирования С++
- Первая программа на Windows. Компилятор g++
- Первая программа на Windows. Компилятор Clang
- Первая программа на Linux. Компилятор g++
- Первая программа на MacOS. Компилятор Clang
- Настройка параметров компиляции
- Локализация и кириллица в консоли
- Структура программы
- Переменные
- Типы данных
- Константы
- Ввод и вывод в консоли
- using. Подключение пространств имен и определение псевдонимов
- Арифметические операции
- Статическая типизация и преобразования типов
- Поразрядные операции
- Операции присваивания
- Условные выражения
- Конструкция if-else и тернарный оператор
- Конструкция switch-case
- Циклы
- Ссылки
- Массивы
- Многомерные массивы
- Массивы символов
- Введение в строки
- Что такое указатели
- Операции с указателями
- Арифметика указателей
- Константы и указатели
- Указатели и массивы
- Определение и объявление функций
- Область видимости объектов
- Параметры функции
- Передача аргументов по значению и по ссылке
- Константные параметры
- Оператор return и возвращение результата
- Указатели в параметрах функции
- Массивы в параметрах функции
- Параметры функции main
- Возвращение указателей и ссылок
- Перегрузка функций
- Рекурсивные функции
- Рекурсия на примере быстрой сортировки
- Указатели на функции
- Указатели на функции как параметры
- Тип функции
- Указатель на функцию как возвращаемое значение
- Разделение программы на файлы
- Внешние объекты
- Динамические объекты
- Динамические массивы
- unique_ptr
- shared_ptr
- Определение классов
- Конструкторы и инициализация объектов
- Управление доступом. Инкапсуляция
- Объявление и определение функций класса
- Конструктор копирования
- Константные объекты и функции
- Ключевое слово this
- Дружественные функции и классы
- Статические члены класса
- Деструктор
- Структуры
- Перечисления
- Наследование
- Управление доступом в базовых и производных классах
- Скрытие функционала базового класса
- Множественное наследование
- Виртуальные функции и их переопределение
- Преобразование типов
- Динамическое преобразование
- Особенности динамического связывания
- Чистые виртуальные функции и абстрактные классы
- Перегрузка операторов
- Операторы преобразования типов
- Оператор индексирования
- Переопределение оператора присваивания
- Пространства имен
- Вложенные классы
- Обработка исключений
- Вложенные try-catch
- Создание своих типов исключений
- Тип exception
- Типы исключений
- Шаблоны функций
- Шаблон класса
- Специализация шаблона класса
- Наследование и шаблоны классов
- Типы контейнеров
- Вектор
- Итераторы
- Операции с векторами
- Array
- List
- Forward_list
- Deque
- Стек std::stack
- Очередь std::queue
- Очередь приоритетов std::priority_queue
- Множества
- Словарь std::map
- Span
- Определение строк
- Строки с поддержкой Unicode
- Преобразование типов и строки
- Сравнение строк
- Получение подстроки и проверка начала и конца строки
- Поиск подстроки
- Изменение строки
- Операции с символами
- Программа подсчета слов
- Тип std:string_view
- rvalue
- Конструктор перемещения
- Оператор присваивания с перемещением
- Роль noexcept при перемещении
- Объекты функций
- Лямбда-выражения
- Захват внешних значений в лямбда-выражениях
- Шаблон std::function<>
- Минимальный и максимальный элементы
- Поиск элементов
- Копирование элементов
- Удаление элементов и идиома Remove-Erase Idiom
- Сортировка
- Представления. Фильтрация
- Проекция данных
- Пропуск элементов. drop_view и drop_while_view
- Извлечение диапазона элементов. take_view и take_while_view
- Цепочки представлений
- Оператор requires
- Концепты
- Выражение requires
- Ограничения типа для auto
- Базовые типы для работы с потоками
- Файловые потоки. Открытие и закрытие
- Чтение и запись текстовых файлов
- Переопределение операторов ввода и вывода
- Математические константы и операции
- Форматирование строк и функция format
- std::optional
- Управление ресурсами. Идиома RAII
- Идиома копирования и замены
- Идиома Move-and-Swap
- Первая программа в Visual Studio
- Первая программа в Qt Creator