Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование / WORD / Лекции по ЯП (часть 3).doc
Скачиваний:
138
Добавлен:
15.04.2015
Размер:
1.34 Mб
Скачать

Функции в языке с

Синтаксис:

тип_функции <имя функции>(список параметров)

{

тело функции

}

Тип функции определяет тип значения, которое возвращает функция с помощью оператора return. Если тип не указан, то по умолчанию предполагается, что функция возвращает целое значение (типа int).

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

В списке параметров для каждого параметра должен быть указан тип.

Оператор return

Оператор return, имеет два варианта использования.

Во-первых, этот оператор вызывает немедленный выход из текущей функции и возврат в вызывающую программу.

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

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

Пример – функция для нахождения наибольшего из двух чисел:

max(int a, int b)

{

int m;

if (a>b) m=a;

else m=b;

return m;

}

max(int a, intb)

{

if (а>b) return a;

else return b;

}

max(int a, int b)

{

if (а>b) return a;

return b;

}

max(int a, int b)

{

return (a>b)? a: b;

}

В случае, когда оператора return в теле функции нет или за ним нет значения, то возвращаемое функцией значение неизвестно (не определено). Если функция должна возвращать значение, но не делает этого, компилятор выдает предупреждение.

Когда функция не возвращает никакого значения, она должна быть описана как функция типа void (пустая).

Стандартным методом передачи аргумента в функцию является передача по значению. Это означает, что в функцию передается копия значения аргумента. Этот метод включает 3 этапа:

  1. Вычисляется значение выражения-аргумента.

  2. Результат копируется в стек — временное хранилище данных в памяти.

  3. Функция извлекает значение аргумента из стека.

Ключевым моментом тут является то, что функция никак не может изменить значение переменной-аргумента, если аргумент передается по значению. Данные снаружи функции защищены от неосторожного вмешательства. Передача по значению возможна для базовых типов данных (char, short, int, long, long long, float, double и long double), и структур.

Альтернативным способом является передача аргументов по адресу. Рисунок иллюстрирует передачу одного аргумента в функцию по адресу.

Если в качестве аргумента функции используется массив, есть лишь один способ – передача параметра по ссылке. В качестве аргумента функ­ции надо указать адрес начала массива. Сделать это можно следующими тремя способами:

function(int ar[10]);

function (int ar[]);

function(int *аг);

Все три способа приведут к одному и тому же результату.

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

Однако, существует еще одна проблема: откуда функция должна знать длину массива, адрес которого ей передан?

Существует два основных способа сообщить функции размер массива.

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

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

Выводы:

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

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

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

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

  5. Не передавайте большие объемы данных по значениям, если в этом нет особой необходимости. Это может привести к переполнению стека.

  6. Не забывайте, что аргумент, передаваемый по адресу, всегда должен быть указателем.

  7. Функция может возвратить только одно значение. А вот при передаче одного или нескольких аргументов по адресу можно заставить функцию «возвращать» сразу нескольких значений.