- •1.2Типы данных
- •1.2.1Объявление переменной
- •1.2.2Категории типов данных
- •1.2.3Целый тип данных
- •1.2.4Данные с плавающей точкой (вещественные типы)
- •1.3Знаки операций
- •1.3.3Простое присваивание
- •1.3.4Составное присваивание
- •1.3.5Приоритеты операций и порядок вычислений
- •1.4Структура и компоненты программы на языке си
- •1.5Организация ввода-вывода в стиле си
- •1.6.1 Манипуляторы и форматирование ввода-вывода
- •1.7Математические функции
- •2Алгоритм. Элементы структурного программирования
- •2.1Понятие алгоритма
- •2.2Основные требования к алгоритмам
- •2.3Элементы структурного программирования
- •3Программирование алгоритмов линейной структуры
- •4Алгоритмы и программы ветвящейся структуры. Условный оператор if. Переключатель switch
- •4.1Алгоритмы и программы ветвящейся структуры
- •4.1.1Условный оператор if
- •If (выражение) оператор1;
- •4.1.2Логические операции
- •4.2Примеры составления алгоритмов и программ с использованием условного оператора If
- •4.3Переключатель switch
- •5Алгоритмы и программы циклической структуры
- •5.1 Понятие цикла. Разновидности циклов
- •5.3Оператор while
- •5.4Оператор do while
- •5.5Оператор continue
- •6Регулярные типы данных. Массивы
- •6.1 Понятие регулярного типа
- •6.2Алгоритмы сортировки массивов
- •6.3 Постановка задачи сортировки и методы её решения
- •6.4Алгоритм прямого упорядочения (Алгоритм сортировки выбором элемента)
- •6.5Алгоритм попарного сравнения соседних элементов («пузырьковая» сортировка)
- •6.6Алгоритм сортировки выбором элемента
- •6.7Методы доступа к элементам массивов, использование указателей
- •6.8Организация многомерных массивов. Указатели на многомерные массивы
- •7.1Описание и определение функции
- •7.2Вызов функции
- •7.3Передача параметров в функцию
- •7.4Описание прототипа функции
- •7.5Функция с переменным количеством параметров
- •7.6Понятие сигнатуры функции
- •7.7Подставляемые (встраиваемые) функции
- •7.8Передача параметров в главную функцию
- •7.9Рекурсивные вызовы функции
- •7.10Примеры составления функций
- •8Указатели
- •8.1Понятие указателя
- •8.2Инициализация указателей
- •8.3Операции с указателями
- •8.4Ссылки
- •9Структуры (struct)
- •10Динамические структуры данных
- •3.1 Односвязные списки
- •Д обавление в начало списка.
- •2 ) Добавление в середину списка.
- •У даление первого элемента списка.
- •3 )Удаление элемента из середины списка.
- •Int Data; //поле данных
- •If (!q) //...И он первый в списке
- •3.2 Стек
- •3.3 Очередь
- •11Динамические массивы
- •12Функции и массивы
- •13Указатели на функции
- •14.1Файловый ввод/вывод с помощью потоков
- •14.2 Дополнительные функции файлового ввода/вывода
- •14.3Режимы файлов
- •14.4 Двоичные файлы
- •14.5Произвольный доступ к файлам
- •Список использованных источников
7.4Описание прототипа функции
Функция должна быть описана до того, как встретится ее первый вызов. Это не всегда возможно, например, когда две функции вызывают друг друга. Когда программа состоит из нескольких файлов, полное описание функции должно присутствовать только в одном файле, но вызовы функции возможны из разных файлов программы. Чтобы разрешить подобные противоречия предусмотрены две формы описания функций, полная форма, называемая также определением функции, и сокращенная, называемая описанием прототипа функции или просто прототипом. Прототип функции содержит только заголовок функции и задает, таким образом, имя функции, тип возвращаемого значения и типы параметров. По этой информации при компиляции программного файла можно проверить правильность записи вызова функции и использования возвращаемого значения. В Си++ требуется, чтобы вызову любой функции предшествовало в том же файле либо полное определение функции, либо описание ее прототипа.
Прототип - это явное объявление функции, которое предшествует определению функции. Тип возвращаемого значения при объявлении функции должен соответствовать типу возвращаемого значения в определении функции.
Если прототип функции не задан, а встретился вызов функции, то строится неявный прототип из анализа формы вызова функции. Тип возвращаемого значения создаваемого прототипа int, а список типов и числа параметров функции формируется на основании типов и числа фактических параметров используемых при данном вызове.
Таким образом, прототип функции необходимо задавать в следующих случаях:
1. Функция возвращает значение типа, отличного от int.
2. Требуется проинициализировать некоторый указатель на функцию до того, как эта функция будет определена.
Наличие в прототипе полного списка типов аргументов параметров позволяет выполнить проверку соответствия типов фактических параметров при вызове функции типам формальных параметров, и, если необходимо, выполнить соответствующие преобразования.
В прототипе можно указать, что число параметров функции переменно, или что функция не имеет параметров.
Если прототип задан с классом памяти static, то и определение функции должно иметь класс памяти static. Если спецификатор класса памяти не указан, то подразумевается класс памяти extern.
Следует отметить ряд дополнительных возможностей описания функций в Си++:
При описании прототипа функции можно не указывать имена параметров, достаточно указать их типы.
7.5Функция с переменным количеством параметров
Функция может иметь переменное число параметров, для части параметров могут быть неизвестны их типы. Неизвестная часть списка параметров обозначается многоточием. Например, функция с прототипом
int varfunc ( int n, ... );
имеет один обязательный параметр типа int и неопределенное число параметров неизвестных типов. Правильная интерпретация такого списка параметров в теле функции требует от программиста дополнительных усилий.
При вызове функции аргументы передаются в функцию по значениям. Это значит, что для каждого аргумента в памяти создается его копия, которая и используется при вычислении функции. Следовательно, любые изменения значений аргументов в теле функции теряются при выходе из функции. Если аргумент является массивом, в функцию передается указатель на начальный элемент массива и присваивания элементам массива в теле функции изменяют значения элементов массива аргумента.