- •21. Основы и создание функций.
- •22. Функции, возвращающие нецелые значения.
- •23.Внешние переменные.
- •24. Область действия.
- •25. Заголовочные файлы.
- •26. Статические переменные.
- •27. Регистровые переменные.
- •28. Блочная структура.
- •29. Инициализация
- •30. Рекурсия.
- •31. Включение файла.
- •32. Макроподстановки.
- •33. Условное включение.
21. Основы и создание функций.
Функции, во-первых, помогут выделить в отдельные подпрограммы дублирующийся код, во-вторых, помогут логически разбить программу на части.
Функция – это именованная часть программы, которая может быть многократно вызвана из другого участка программы (в котором эта функция видна). Функция может принимать фиксированное либо переменное число аргументов, а может не иметь аргументов. Функция может как возвращать значение, так и быть пустой (void) и ничего не возвращать.
Мы уже знакомы с многими функциями и знаем, как их вызывать – это функции библиотек stdio, stdlib, string, conio и пр. Более того, main – это тоже функция. Она отличается от остальных только тем, что является точкой входа при запуске приложения. Функция в си определяется в глобальном контексте. Синтаксис функции:
<возвращаемый тип> <имя функции>(<тип1> <арг1>, <тип1> <арг2>, ...) { <тело функции> } |
Самый простой пример – функция, которая принимает число типа float и возвращает квадрат этого числа.
|
#include <conio.h> #include <stdio.h>
float sqr(float x) { float tmp = x*x; return tmp; }
void main() { printf("%.3f", sqr(9.3f)); getch(); } |
Внутри функции sqr мы создали локальную переменную, которой присвоили значение аргумента. В качестве аргумента функции передали число 9.3. Служебное слово return возвращает значение переменной tmp. Можно переписать функцию следующим образом:
|
float sqr(float x) { return x*x; } |
В данном случае сначала будет выполнено умножение, а после этого возврат значения. В том случае, если функция ничего не возвращает, типом возвращаемого значения будет void. Например, функция, которая печатает квадрат числа:
void printSqr(float x) { printf("%d", x*x); return; } |
в данном случа return означает выход из функции. Если функция ничего не возвращает, то return можно не писать. Тогда функция доработает до конца и произойдёт возврат управления вызывающей функции.
void printSqr(float x) { printf("%d", x*x); } |
Если функция не принимает аргументов, то скобки оставляют пустыми. Можно также написать слово void:
22. Функции, возвращающие нецелые значения.
Говорится что возвращает число с плавающей точкой float sqr(float x) {
float tmp = x*x;
return tmp;
}
23.Внешние переменные.
Группу extern – описаний можно совсем опустить, если исходные определения переменных появляются в том же файле и перед функцией, которая их использует. Включение ключевого слова extern позволяет функции использовать внешнюю переменную, даже если она определяется позже в этом или другом файле. (Оба файла, конечно, должны быть скомпилированы, связаны или собраны в одно и то же время.)
Если слово extern не включено в описание внутри функции, то под этим именем создается новая автоматическая переменная. Вы можете пометить вторую переменную как "автоматическую" с помощью слова auto и тем самым показать, что это ваше намерение, а не оплошность. Две примера демонстрируют четыре возможных комбинация описаний:
/* Пример1 */
int hocus;
main( ) {
extern int hocus; /* hocus описана внешней */
...
}
magic( ) {
extern int hocus;
...
}
Здесь есть одна внешняя переменная hocus, и она известна обеим функциям main( ) и magic( ).
/* Пример2 */
int hocus ;
main( )
{
