Студопедия — Тело_функции
Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

Тело_функции






}

Тело_функции – это часть определения функции, ограниченная фигурными скобками и непосредственно размещенная вслед за заголовком функции. Оно может быть либо составным оператором, либо блоком [1]. В языке С определения функций не могут быть вложенными, т. е. внутри одной функции нельзя объявить и расписать тело другой функции.

Возвращаемый тип функции возвр-тип определяет тип данного, возвращаемого функцией. Это могут быть, например, int, float, double и т. д. В случае когда функция ничего не возвращает, ей присваивается тип void.

Функция может возвращать любой тип данных, за исключением массивов. Список параметров – это список, элементы которого отделяются друг от друга запятыми [1]. При вызове функции параметры принимают значения аргументов. Если функция без параметров, то такой пустой список можно указать в явном виде, поместив для этого в скобки ключевое слово void. Все параметры функции (входящие в список параметров) должны объявляться отдельно, причем для каждого из них надо указывать и тип, и имя. В общем виде список объявлений параметров должен выглядеть следующим образом [1]:

fun(тип имя_перем1, тип имя_перем2, ¼, тип имя_перем N)

Например:

fun(int i, int j, float k, char str1, char str2)

Рассмотрим пример программы с выводом сообщения не в главной функции main(), а в другой.

#include <stdio.h> #include <conio.h> void printMessage (void) { printf("\n\t hello, world\n"); return; printf("\n\t 123\n"); } int main(void) { printMessage(); printf("\n Press any key: "); getch(); return 0; }  


Результат выполнения программы показан на рис. 10.1.

Рис. 10.1. Вывод сообщения с помощью двух функций

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

printf("\n\t hello, world\n");


В функции printMessage() есть также утверждение printf("\n\t 123\n"), которое не выполняется, поскольку используется утверждение возврата из функции (return).

В языке С функция введена как один из производных типов.

Формальные параметры в определениях функций могут объявляться в форме прототипов, которые дают компилятору возможность тщательнее выполнять проверять типы аргументов [1, 3]. Если используются прототипы, то компилятор может обнаружить любые сомнительные преобразования типов аргументов, необходимые при вызове функции, если тип ее параметров отличается от типов аргументов. Компилятор также обнаружит различия в количестве аргументов, использованных при вызове функции, и в количестве параметров функции.

В общем случае прототип функции должен выглядеть таким образом [1]:

тип имя_функции (тип имя_пар 1, тип имя_пар 2, ¼, тип имя_парN);

В приведенной выше программе прототип функции printMessage() неприменялся, так как сама функция была объявлена до главной функции main(). Для переносимости С -кода в С++ использование прототипа функции обязательно. Поэтому хорошим стилем программирования можно считать работу с прототипами функций, поскольку большие программы обычно состоят из нескольких функций, часто расположенных в различных файлах.

Рассмотренная ранее программа с использованием прототипа функции printMessage() будет выглядеть следующим образом.

#include <stdio.h> #include <conio.h> //void printMessage (void);//Прототип функции int main(void) { void printMessage (void); //Прототип функции printMessage(); // Вызов функции printf("\n Press any key: "); getch(); return 0; } // Определение функции void printMessage (void) { printf("\n\t hello, world\n"); return; printf("\n\t 123\n"); }  

В листинге программы показаны две возможности использования прототипа функции printMessage(). При этом сама функция printMessage() объявлена после функции main().

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

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

Синтаксис языка С предусматривает только один способ передачи параметров – передачу по значениям. Это означает, что формальные параметры функции локализованы в ней, т. е. недоступны вне определения функции, и никакие операции над формальными параметрами в теле функции не изменяют значений фактических параметров [4].

Передача параметров по значению предусматривает следующие шаги [4].

1. При компиляции функции выделяются участки памяти для формальных параметров, т. е. формальные параметры оказываются внутренними объектами функции. При этом для параметров типа float формируются объекты типа double, а для параметров типов char и short int – объекты типа int. Если параметром является массив, то создается указатель на начало этого массива, и он служит представлением массива-параметра в теле функции.

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

3. Значения выражений – фактических параметров заносятся в участки памяти, выделенные для формальных параметров функции.

4. В теле функции выполняется обработка с использованием значений внутренних объектов-параметров, и результат передается в точку вызова функции как возвращаемое ею значение.

5. Никакого влияния на фактические параметры (на их значения) функция не оказывает.

6. После выхода из функции освобождается память, выделенная для ее формальных параметров.

Важно то, что объект вызывающей программы, использованный в качестве фактического параметра, не может быть изменен из тела функции. Но существует косвенная возможность изменять значения объектов вызывающей программы действиями в вызванной функции. Это становится возможным с помощью указателя (указателей), когда в вызываемую функцию передается адрес любого объекта из вызывающей программы. С помощью выполняемого в тексте функции разыменования указателя осуществляется доступ к адресуемому указателем объекту из вызывающей программы. Тем самым, не изменяя самого параметра (указатель-параметр постоянно содержит только адрес одного и того же объекта), можно изменять объект вызывающей программы.

Массивы и строки также могут быть параметрами функции. В этом случае внутрь функции передается только адрес начала массива. Тогда можно в качесстве параметра использовать указатель. Приведем два равноправных прототипа функций:

float fun(int n, float A[ ], float B[ ]);

float fun(int n, float *a, float *b);

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

В языке С существует возможность создавать функции, число аргументов которых не определено – функции с переменным числом аргументов [7]. При этом следует указать только количество аргументов. Пример прототипа функции с переменным числом аргументов:

int fun(int n, ¼);

Многоточие (¼;) в прототипе функции означает, что функция получает переменное число аргументов любого типа. Многоточие должно всегда находиться в конце списка параметров [7].

Макросы и определения заголовочного файла переменных аргументов stdarg.h (табл. 10.1) предоставляют программисту средства, необходимые для построения функций со списком аргументов переменной длины [7].

  Таблица 10.1
Макросы заголовочного файла stdarg.h
Идентификатор Объяснение
va_list Тип, предназначающийся для хранения информации, необходимой макросам v_start, va_arg и va_end. Чтобы получить доступ к аргументам в списке переменной длины, необходимо объявить объект типа va_list
va_start Макрос, который вызывается перед обращением к аргументам списка переменной длины. Он инициализирует объект, объявленный с помощью va_list, для использования макросами va_arg и va_end
va_arg Макрос, расширяющийся до выражения со значением и типом следующего аргументав списке переменной длины. Каждый вызов его изменяет объект, объявленный с помощью va_list так, что объект указаывает на следующий аргумент списка
va_end Макрос обеспечивает нормальный возврат из функции, на список аргументов которой ссылается макрос va_start
     

Примеры обращений к функции с фактическими аргументами:


 

double k; double v1 = 1.5, v2 = 2.5, v3 = 3.5; // Первый вариант, где 3 – количество аргументов k = fun(3,v1, v2, v3); // Второй вариант, где 0.0 – завершающий нуль списка аргументов k = fun(v1, v2, v3, 0.0);

 

 







Дата добавления: 2015-09-06; просмотров: 454. Нарушение авторских прав; Мы поможем в написании вашей работы!



Практические расчеты на срез и смятие При изучении темы обратите внимание на основные расчетные предпосылки и условности расчета...

Функция спроса населения на данный товар Функция спроса населения на данный товар: Qd=7-Р. Функция предложения: Qs= -5+2Р,где...

Аальтернативная стоимость. Кривая производственных возможностей В экономике Буридании есть 100 ед. труда с производительностью 4 м ткани или 2 кг мяса...

Вычисление основной дактилоскопической формулы Вычислением основной дактоформулы обычно занимается следователь. Для этого все десять пальцев разбиваются на пять пар...

Типовые ситуационные задачи. Задача 1. Больной К., 38 лет, шахтер по профессии, во время планового медицинского осмотра предъявил жалобы на появление одышки при значительной физической   Задача 1. Больной К., 38 лет, шахтер по профессии, во время планового медицинского осмотра предъявил жалобы на появление одышки при значительной физической нагрузке. Из медицинской книжки установлено, что он страдает врожденным пороком сердца....

Типовые ситуационные задачи. Задача 1.У больного А., 20 лет, с детства отмечается повышенное АД, уровень которого в настоящее время составляет 180-200/110-120 мм рт Задача 1.У больного А., 20 лет, с детства отмечается повышенное АД, уровень которого в настоящее время составляет 180-200/110-120 мм рт. ст. Влияние психоэмоциональных факторов отсутствует. Колебаний АД практически нет. Головной боли нет. Нормализовать...

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

Измерение следующих дефектов: ползун, выщербина, неравномерный прокат, равномерный прокат, кольцевая выработка, откол обода колеса, тонкий гребень, протёртость средней части оси Величину проката определяют с помощью вертикального движка 2 сухаря 3 шаблона 1 по кругу катания...

Неисправности автосцепки, с которыми запрещается постановка вагонов в поезд. Причины саморасцепов ЗАПРЕЩАЕТСЯ: постановка в поезда и следование в них вагонов, у которых автосцепное устройство имеет хотя бы одну из следующих неисправностей: - трещину в корпусе автосцепки, излом деталей механизма...

Понятие метода в психологии. Классификация методов психологии и их характеристика Метод – это путь, способ познания, посредством которого познается предмет науки (С...

Studopedia.info - Студопедия - 2014-2024 год . (0.01 сек.) русская версия | украинская версия