
prog_lk9_new.pptx
- Количество слайдов: 108
Cпецификаторы класса хранения
Cпецификаторы класса хранения (модификаторы хранения) Cпецификаторы класса хранения сообщают компилятору, как хранить следующую за ним переменную. • auto; • extern; • static; • register.
Спецификатор auto используется для объявления локальных переменных (локальные переменные являются auto по умолчанию).
Спецификатор extern используeтся при объявле нии переменных в многофайловых программах. Т. к. С++ позволяет выполнять раздельную компиляцию модулей для большой программы, существует способ передачи информации о глобальных переменных файлам программы. Все глобальные переменные объявляются в одном файле и используются при объявлении в других файлах слова extern.
Пример Файл 1 int х, у; char ch; Файл 2 extern int x, y; extern char ch; main(void) {. . . } void func 22(void) { х= у/ 10; } void func 1 (void) { x = 23; } void func 23(void) { y=10; }
Спецификатор extern сообщает компилятору, что следующие за ним типы и имена переменных объявляются где то в другом месте. Т. о. extern позволяет компилятору знать о типах и именах глобальных переменных без действительного создания этих переменных. Когда два модуля объединяются, все ссылки на внешние переменные пересматриваются.
Спецификатор static • Спецификатор static используется для объявления переменных, которые являются постоянными переменными внутри функции или файла. • Они отличаются от глобальных переменных, поскольку не известны за пределами функции или файла, но могут хранить свои значения между вызовами.
Статические локальные переменные • Когда static применяется к локальной переменной, это приводит к тому, что компилятор создает долговременную область для хранения переменной почти таким же способом, как это делается для глобальной переменной. • Ключевое различие между статической локальной и глобальной переменными заключается в том, что статическая локальная переменная остается известной только в том блоке, в котором она была объявлена. • Статическая локальная переменная это локальная переменная, сохраняющая свое значение между вызовами функций.
Статические глобальные переменные • Когда спецификатор static применяется к глобальной переменной, он сообщает компилятору о необходимости создания глобальной переменной, которая будет известна только в файле, где статическая глобальная переменная объявлена. • Это означает, что, даже если переменная является глобальной, другие подпрограммы в других файлах не будут знать о ней.
Статические глобальные переменные • Имена статических локальных переменных известны только функции или блоку кода, в которых они объявлены, а имена статических глобальных переменных известны только в файле, в котором они находятся. • В сущности модификатор static разрешает использование функциями переменных, не беспокоя другие функции.
Спецификатор register • Спецификатор register применяется только к пе ременным типа nt и char. i • Используется для объявле ния переменных, которые хранятся не в ОП, а в регистрах ЦП (для экономии времени). • Подобная экономия делает register переменные идеальными для управления циклом. • Допускается применять к локальным перемен ным и к формальным параметрам в функции, но нельзя использовать для глобальных переменных.
Спецификатор register • Количество регистровых переменных в С++ ограни чено вумя. д • С автоматически делает регистровые перемен ные нерегистровыми, как только количество регистровых переменных достигнет предела.
Функции
Подпрограммы • В основе конструкции функций лежит понятие подпрограммы, впервые введенное в 1957 г. М. Уилксом. • Подпрограмма это само стоятельный фрагмент программы, оформленный особым способом, которой присвоено имя. • Подпрограмма – это одна из базовых структур в структурном программи ровании, позволяющая избежать повторных записей одинаковых фрагментов в программе. • Подпрограммы в C++ реализуются в виде функций.
Функции • В языке C++ нет деления на процедуры и функции. • В C++ программа состоит только из функций. • Функция это независимая совокупность объявле ний и операторов, обычно предназначенная для выполне ния определенной задачи. • Каждая функция имеет имя, которое используется для вызова функции.
Функции • Имя одной из функций main зарезервировано за функцией, которая должна присутствовать в каждой программе, причем функция main необязательно должна быть первой, хотя с нее всегда начинается выполнение. • При вызове функции ей могут быть переданы дан ные посредством аргументов функции. • Функция может возвращать значение. При этом могут быть определены функции, которые не имеют никаких параметров и не воз вращают никакого значения.
Объявление функции • Формат описания функции: [тип] <имя функции> (список параметров) { тело функции }
Объявление функции • Тип определяет тип значения, которое возвращает функция с помощью оператора return. • Если тип не ука зан, то по умолчанию предполагается, что функция воз вращает целое значение (типа int). • Список параметров состоит из перечня типов и имен параметров, разделен ных запятыми. • Функция может не иметь параметров, но круглые скобки необходимы в любом случае.
Объявление функции • В списке параметров для каждого параметра дол жен быть указан ип: т f(int х, int у, float z)
Оператор return имеет два варианта использова ния : • оператор вызывает немедленный выход из текущей функции и возврат в вызывающую про грамму ; • оператор используется для возврата значения функции. В теле функции может быть не сколько операторов eturn, может не быть ни одного. В этом случае возврат в r вызывающую программу проис ходит после выполнения последнего оператора тела функции.
Пример 1 //Функция находит max из двух чисел. max(int a, int b) { int m; if (a>b) m=а; else m=b; return m; }
Пример программы #include
Пример 1 //Та же функция, но без использования до полнительной переменной m max(int a, int b) { if (a>b) return a; else return b; }
Пример программы #include
Пример 1 //Укороченная запись той же функции max(int a, int b) { if (a>b) return a; return b; }
Пример программы #include
Пример 1 //Еще более короткая запись той же функции max(int a, int b) { return (a>b)? a: b; }
Пример программы #include
Возвращаемые значения • В случае, когда оператора return в теле функции нет или за ним нет значения, то возвращаемое функцией значение неизвестно (не определено). • Если функция должна возвращать значение, но не делает этого, компилятор выдает предупреждение. • Все функции, возвращаю щие значения, могут использоваться в выражениях языка С++, но они не могут использоваться в левой части операто ра присваивания, за исключением тех случаев, когда воз вращаемым значением является указатель.
Возвращаемые значения • Использование функций, возвращающих указате ли, имеют некоторые особенности. • Указатели не являются ни типом целое (int), ни типом беззнаковое целое (unsigned int). • Их значениями являются адреса памяти данных определенного типа, соответственно должна быть описана и функция.
Пример //описание функ ции, возвращающей указатель на тип har. Функция c находит в строке первый пробел и возвращает его адрес. char *find(char *string) { int i=0; while ((string[i]!=' ')&&(string[i] !=' ')) i++; if (string[i]) return &string[i]; // возвращает адрес первого пробела else return NULL; // возврат нулевого указателя }
#include