Вызовом функции называется выражение, которое передает функции управление и аргументы (если они есть). Такие выражения имеют следующую форму:
где expression — это имя функции или выражение, результатом которого является адрес функции, а expression-list содержит список выражений, разделенных запятыми. Значения этих выражений являются аргументами, которые передаются функции. Если функция не возвращает значения, то при ее объявлении необходимо указать, что она возвращает тип void .
Если объявление указывается до вызова функции, однако информация о ее параметрах не приводится, то для любых необъявленных аргументов выполняются обычные арифметические преобразования.
Выражения в списке аргументов функции могут оцениваться в любом порядке, поэтому аргументы, значения которых могут изменяться в качестве побочного эффекта других аргументов, имеют неопределенные значения. Точка следования, определяемая оператором вызова функции, гарантирует только то, что все побочные эффекты в списке аргументов будут оценены до того, как управление будет передано вызванной функции. (Обратите внимание, что порядок, в котором аргументы отправляются в стек, — это отдельная тема.) Дополнительные сведения см. в разделе Точки следования.
Функции c++ примеры. Синтаксис. Объявление, реализация функции. Параметры, аргументы. C++ #33
Единственное требование к любому вызову функции заключается в том, что выражение перед скобками должно иметь своим результатом адрес функции. Это означает, что функцию можно вызвать любым выражением, значением которого является указатель функции.
Пример
В следующем примере представлен вызов функций, совершаемый из оператора switch :
int main() < /* Function prototypes */ long lift( int ), step( int ), drop( int ); void work( int number, long (*function)(int i) ); int select, count; . . . select = 1; switch( select ) < case 1: work( count, lift ); break; case 2: work( count, step ); break; case 3: work( count, drop ); /* Fall through to next case */ default: break; >> /* Function definition */ void work( int number, long (*function)(int i) )
В этом примере вызов функции располагается в функции main :
work( count, lift );
Он передает функции count целочисленную переменную lift , а также адрес функции work . Обратите внимание, что адрес функции передается просто в виде идентификатора функции, поскольку он равен выражению указателя. Чтобы идентификатор функции можно было использовать таким образом, функцию необходимо объявить и определить до того, как будет использован идентификатор; в противном случае идентификатор не будет распознан. В этом случае прототип функции work задан в начале функции main .
Параметр function в функции work объявлен как указатель на функцию, принимающую один аргумент типа int и возвращающую значение типа long . Скобки вокруг имени параметра являются обязательными. Без них это объявление будет означать, что функция возвращает указатель на значение типа long .
Функция work вызывает выбранную функцию из цикла for , используя следующий вызов:
35 Функции (def) в Python. Определение и вызов функции
( *function )( i );
Вызываемой функции передается один аргумент, i :
Источник: learn.microsoft.com
Вызов программы-функции
Для выполнения программы-функции необходимо обратиться к ней по имени с указанием списка фактических параметров и нажать клавишу «=». Оператор «=» используется для вывода на экран значений переменных и результатов вычисления выражений.
(список фактических параметров)
Для каждого формального параметра при вызове программы-функции задается фактический параметр, значение которого должно быть определено. Именно с фактическими параметрами выполняются вычисления в программе-функции.
Фактическими параметрами могут быть константы, переменные, массивы. Между фактическими и формальными параметрами должно быть соответствие по количеству, типу и порядку следования. Имена фактических параметров при вызове программы-функции могут не совпадать с именами ее формальных параметров.
Примеры обращений к программе-функции f(x) (рис. 2.3):
При вызове программы-функции в качестве фактических параметров используются константа 7, переменная х и выражение (r+5), в третьем случае вызов программы-функции осуществляется в операторе присваивания. Переменная t, используемая при вызове программы-функции f(x) никак не связана с локальной переменной t, используемой внутри программы-функции. Локальный характер таких переменных позволяет использовать для их идентификаторов те же имена, что и у переменных документа. Однако лучше этого не делать и использовать разные имена для локальных переменных программы-функции и для переменных документа.
Для передачи данных внутрь программы-функции можно использовать как механизм параметров, так и описанные ранее переменные документа. Если в описании программы-функции отсутствует список формальных параметров, то и при ее вызове будет отсутствовать список фактических параметров, данные в программу-функцию передаются через имена переменных, определенных выше текста программы-функции. Эти переменные передаются в программу как значения и не изменяются, если в программе-функции им присваиваются другие значения (рис. 2.4).
Рис. 2.4. Передача в программу-функцию переменных документа
Хотя значение переменной х изменилось внутри программы-функции, вне ее описания переменная х сохранила свое прежнее значение.
Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:
Источник: studopedia.ru
8.2. Определение и вызов функции
Синтаксис заголовка функции:
[Тип возвращаемого значения] имя функции ([список формальных параметров ])
Формальные параметры в списке заголовка функции разделяются запятыми.
Синтаксис формального параметра:
Тип возвращаемого функцией значения может быть любым типом С++, кроме массива (но может быть указателем на массив) и функции (но может быть указателем на функцию).
Если функция не возвращает значения, то перед ее именем указывается тип void. Если функция возвращает целое значение, то перед ее именем можно не указывать тип int. Таким образом, два заголовка функции int f() и f() эквивалентны.
Тело функции может содержать операторы, объявления и директивы препроцессора. Если функция возвращает значение, то в ее теле должен быть как минимум один оператор return вида:
return выражение;
Пример определения функции, которая имеет два целочисленных параметра и возвращает целое значение, равное сумме значений параметров:
int sum (int x, int y)
Функция sum возвращает целое значение, поэтому перед ее именем указан тип int, а в ее теле присутствует оператор return выражение, тип выражения также int.
Функция активизируется только в момент ее вызова. Функция вызывается по имени. Если у функции есть параметры, то при вызове после имени функции в кругых скобках указываются фактические параметры функции (аргументы функции). Аргументы указываются без типов и разделяются запятыми. Если у функции нет параметров, то она вызывается с пустыми круглыми скобками после имени функции.
Синтаксис вызова функции:
Имя функции ([список аргументов])
Пример вызова функции sum:
Пример программы с функцией без параметров и без возвращаемого значения:
// Функция выводит горизонтальную линию из 60 символов
line(); //при вызове функции скобки обязательны
Если функция не возвращает значение, то наличие в теле функции оператора return не обязательно (функция завершает работу по последней фигурной скобке).
8.3. Место определения функции в программе
Функции в С++ не могут быть вложенными — функции в программе записываются последовательно друг за другом. Местоположение функции в последовательности функций определяется основным правилом типизированных языков: «Любое имя, в том числе и имя функции, должно быть объявлено до его использования». Компилятор использует список формальных параметров и тип возвращаемого функцией значения для проверки правильности ее вызова. Размещение определения функции до вызыва функции приводит к естественному выполнению рассмотренного правила.
Пример программы вычисления значения выражения с=n!m!/(n+m)!, в которой алгоритм вычисления факториала оформлен в виде функции:
c=(float) fact(n) * fact(m)/ fact (n+m); //функция вызывается 3 раза
В С++ определение функции может находиться и после вызывающей ее функции (и даже в другом файле), что более соответствует нисходящему программированию, когда вначале кодируется и отлаживается главная функция (main), вызывающая другие функции, а затем кодируются вызываемые функции. При отладке главной функции вызываемые функции заменяются «заглушками». Размещение определения функции после ее вызова требует присутствия в программе до вызова функции прототипа (предварительного объявления) вызываемой функции. Прототип функции используется компилятором для проверки правильности вызова функции. Неправильный вызов обнаруживается на стадии компиляции, что облегчает отладку программы и повышает ее надежность.
Синтаксис прототипа функции:
тип_результата имя_функции ([список типов ФОП]) ;
тип_результата имя_функции ([список ФОП]);
Второй способ задания прототипа является более наглядным. Имена формальных параметров в списке могут быть любые.
Примеры прототипов функции:
int sum (int, int);
int sum (int x, int y);
Прототип функции может находиться:
- Вне функций. В этом случае он действует на все вызовы функции, расположенные ниже прототипа в любых функциях.
- Внутри одного из блоков (составного оператора) вызывающей функции. В этом случае он действует на вызовы функции из этого блока.
Желательно прототипы всех функций программы располагать в одном месте, например, в начале файла с программой или в отдельном файле (в заголовочном файле). В этом случае программа становится более наглядной, а определения функций и их вызовы функций могут следовать в любом порядке. Пример программы вычисления коэффициента надежности теста. Программа состоит из нескольких функций. Группа из n (n <=300) испытуемых последовательно выполняет задания двух параллельных тестов. Суммарные оценки по двум тестам записываются в двух массивах (x и y). Один из критериев качества теста – коэффициент надежности теста. Для «идеального» теста он равен 1. Коэффициент надежности теста вычисляется по формуле: где Mx и
математическое ожидание и стандартное отклонение тестовых оценок испытуемых по тесту х,My и
математическое ожидание и стандартное отклонение тестовых оценок испытуемых по тестуy. Mx,
,My и
вычисляются по формулам:
,
,
,
Алгоритм расчета коэффициента надежности на псевдокоде: Ввод n Ввод х Ввод y Вычисление Mx Вычисление My Вычисление
Вычисление
Вычисление r Вывод r Текст программы: #include #include #include void input (int a[], int n); //ввод массива float m (int a[], int n); //математическое ожидание float d (int a[], int n, float ma); //стандартное отклонение float r (int a[], int b[], int n, float ma, float mb, float da, float db); //коэффициент надежности void main() < int n; //количество испытуемых int x[300], y[300]; //массивы оценок float mx, my ;//математические ожидания float dx, dy; //стандартные отклонения float rt; //коэффициент надежности cout>n; cout void input (int a[],int n) < for (int i=0; i>a[i]; > float m (int a[],int n) < int s=0; for (int i=0; ifloat d (int a[],int n, float ma) < float s=0; for (int i=0; ifloat r (int a[], int b[], int n, float ma,float mb, float da, float db) < float s=0; for (int i=0; i
Источник: studfile.net