МЕНЮ


Фестивали и конкурсы
Семинары
Издания
О МОДНТ
Приглашения
Поздравляем

НАУЧНЫЕ РАБОТЫ


  • Инновационный менеджмент
  • Инвестиции
  • ИГП
  • Земельное право
  • Журналистика
  • Жилищное право
  • Радиоэлектроника
  • Психология
  • Программирование и комп-ры
  • Предпринимательство
  • Право
  • Политология
  • Полиграфия
  • Педагогика
  • Оккультизм и уфология
  • Начертательная геометрия
  • Бухучет управленчучет
  • Биология
  • Бизнес-план
  • Безопасность жизнедеятельности
  • Банковское дело
  • АХД экпред финансы предприятий
  • Аудит
  • Ветеринария
  • Валютные отношения
  • Бухгалтерский учет и аудит
  • Ботаника и сельское хозяйство
  • Биржевое дело
  • Банковское дело
  • Астрономия
  • Архитектура
  • Арбитражный процесс
  • Безопасность жизнедеятельности
  • Административное право
  • Авиация и космонавтика
  • Кулинария
  • Наука и техника
  • Криминология
  • Криминалистика
  • Косметология
  • Коммуникации и связь
  • Кибернетика
  • Исторические личности
  • Информатика
  • Инвестиции
  • по Зоология
  • Журналистика
  • Карта сайта
  • Лекции по C++

    Любой из четырех спецификаторов класса памяти может быть использован

    для об"явления переменной на внутреннем уровне. Если спецификатор класса

    памяти опускается в об"явлении переменной на внутреннем уровне, то

    подразумевается класс памяти auto.

    Спецификатор класса памяти auto об"являет переменную с ло-

    кальным временем жизни. Переменная видима только в том блоке, где она

    об"явлена. Об"явления переменных auto могут включать инициализаторы.

    Переменные класса памяти auto автоматически не инициализируются, а

    инициализируются явно при об"явлении или присваивании начальных значений,

    посредством операторов внутри блока. Если нет инициализации, то величина

    переменной auto считается неопределенной.

    Спецификатор класса памяти register сообщает компилятору о том, чтобы

    он распределил память под переменную в регистре, если это возможно.

    Использование регистровой памяти обычно приводит к более быстрому времени

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

    с классом памяти register име-

    ют ту же самую видимость, что и переменные auto.

    Число регистров, которое может быть использовано под память переменных,

    зависит от машины. Когда компилятор встречает спецификатор класса памяти

    register в об"явлении, а свободного регистра не имеется, то для переменной

    распределяется память класса auto. Компилятор назначает переменным

    регистровую память в том порядке, в котором появляются об"явления в

    исходном файле. Регистровая память, если она имеется, гарантирована только

    для целого и адресного типов.

    Переменная, об"явленная на внутреннем уровне со спецификатором класса

    памяти static,имеет глобальное время жизни и имеет видимость только

    внутри блока, в котором она об"явлена. В отличие от переменных auto,

    переменные, об"явленные как static, сохраняют свое значение при завершении

    блока.

    Переменные класса памяти static могут быть инициализированы константным

    выражением. Если явной инициализации нет, то переменная класса памяти

    static автоматически устанавливается в 0. Инициализация выполняется один

    раз во время компиляции. Инициализация переменной класса памяти static не

    повторяется при новом входе в блок.

    Переменная, об"явленная со спецификатором класса памяти extern,

    является ссылкой на переменную с тем же самым именем, определенную на

    внешнем уровне в любом исходном файле программы.

    Цель внутреннего об"явления extern состоит в том, чтобы

    сделать определение переменной внешнего уровня видимой внутри блока.

    Внутреннее об'явление extern не изменяет видимость глобальной переменной

    в любой другой части программы.

    Пример:

    int i = 1;

    main()

    { /* reference to i, defined above */

    extern int i;

    /* initial value is zero; a is

    visible only within main */

    static int a;

    /* b is stored in a register, if possible */ register int b

    = 0;

    /* default storage class is auto */

    int c = 0;

    /* values printed are 1, 0, 0, 0 */

    printf("%d\n%d\n%d\n%d\n", i, a, b, c);

    other();

    }

    other()

    {

    /* i is redefined */

    int i = 16;

    /* this a is visible only within other */

    static int a = 2;

    a += 2;

    /* values printed are 16, 4 */

    printf("%d\n%d\n", i, a);

    }

    Переменная i определяется на внешнем уровне с инициализацией 1. В

    функции main об"явлена ссылка extern на переменную i внешнего уровня.

    Переменная класса памяти static автоматически

    устанавливается в 0, так как инициализатор опущен. Вызов функции print

    (предполагается, что функция print определена в каком-то месте исходной

    программы.) печатает величины 1, 0, 0, 0.

    В функции other, переменная i переопределяется как локальная переменная

    с начальным значением 16. Это не влияет на значение внешней переменной i.

    Переменная a об"является как переменная класса памяти static с начальным

    значением 2. Она не противоречит переменной a, об"явленной в функции main,

    так как видимость переменных класса памяти static на внутреннем уровне

    ограничена блоком, в котором она об"явлена.

    Значение переменной увеличивается на 2 и становится равным 4. Если бы

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

    значение a стало бы равным 4. Внутренние переменные класса памяти static

    сохраняют свои значения, когда заканчивается выполнение блока, в котором

    они об"явлены.

    Об"явление функции на внешнем и внутреннем уровнях

    Функции могут быть об"явлены со спецификаторами класса памяти static

    или extern. Функции всегда имеют глобальное время жизни.

    Правила видимости для функций отличаются от правил видимости для

    переменных. Об"явления функций на внутреннем уровне имеют тот же самый

    смысл, что и об"явления на внешнем уровне. Это значит, что функции не могут

    иметь блочной видимости и видимость функций не может быть вложенной.

    Функция об"явленная как static,

    видима только в пределах исходного файла, в котором она определяется. Любая

    функция в том же самом исходном файле может вызвать функцию static, но

    функции static из других файлов нет. Функция static с тем же самым именем

    может быть об"явлена в другом исходном файле.

    Функции, об"явленные как extern видимы в пределах всех исходных

    файлов, которые составляют программу. Любая функция может вызвать функцию

    extern.

    Об"явления функций, в которых опущен спецификатор класса памяти,

    считаются по умолчанию extern.

    Инициализация

    В об"явлении переменной может быть присвоено начальное значение

    посредством инициализатора. Величина или величины инициализатора

    присваиваются переменной.

    Синтаксически, записи инициализатора предшествует знак равно (=)

    =

    Могут быть инициализированы переменные любого типа. Функции не

    инициализируются. Об"явления, которые используют спецификатор класса памяти

    extern не могут содержать инициализатора.

    Переменные, об"явленные на внешнем уровне, могут быть ини-

    циализированы. Если они явно не инициализированы, то они устанавливаются в

    нуль во время компиляции или линкования. Любая переменная, об"явленная со

    спецификатором класса памяти static, может быть инициализирована

    константным выражением. Инициализация переменных класса static выполняется

    один раз во время компиляции. Если отсутствует явная инициализация, то

    переменные класса памяти static автоматически устанавливаются в нуль.

    Инициализация переменных auto и register выполняется каждый раз при

    входе в блок, в котором они об"явлены. Если инициализатор опущен в

    об"явлении переменной класса памяти auto или register, то начальное

    значение переменной не определено. Инициализация

    составных типов auto (массив, структура, совмещение) запрещена. Любое

    составное об"явление класса памяти static может быть инициализировано на

    внешнем уровне.

    Начальными значениями для внешних об"явлений переменной и для всех

    переменных static как внешних так и внутренних должно быть константное

    выражение. Автоматические и регистровые переменные могут быть

    инициализированы константными или переменными величинами.

    Базовые типы и типы указателей

    Синтаксис:

    =

    Величина выражения присваивается переменной. Для выражения допустимы

    правила преобразования.

    Примеры:

    int x = 10; /* Example 1 */

    register int *px = 0; /* Example 2 */ int c = (3 * 1024);

    /* Example 3 */ int *b = &x; /* Example 4

    */

    В первом примере x инициализируется константным выражением 10. Во

    втором примере, указатель px инициализирован нулем, в результате чего

    получился "null" указатель. В третьем примере используется константное

    выражение для инициализации c. В четвертом примере инициализируется

    указатель b адресом другой переменной x.

    Составные типы

    Синтаксис:

    ={}

    Список инициализаторов - это последовательность

    инициализаторов, разделенных запятыми. Каждый инициализатор в

    последовательности- это либо константное выражение, либо список

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

    появиться внутри другого списка инициализации. Эта конструкция

    используется для инициализации элементов составных конструкций.

    Для каждого списка инициализации значения константных выражений

    присваиваются в порядке следования элементов составной переменной. Когда

    инициализируется совмещение, то список инициализаторов представляет собой

    единственное константное выражение. Величина константного выражения

    присваивается первому элементу совмещения.

    Если в списке инициализации меньше величин, чем их имеется в составном

    типе, то оставшиеся памяти инициализируются нулем. Если число

    инициализирующих величин больше чем требуется, то выдается ошибка.

    Эти правила применяются к каждому вложенному списку инициализаторов,

    точно так же как и ко всей конструкции в целом.

    Пример:

    int p[4] [3] = {

    { 1, 1, 1 },

    { 2, 2, 2 }, { 3, 3, 3,}, { 4, 4, 4,},

    };

    В примере об"является массив p размерности 4 строки на 3 столбца.

    Элементы первой строки инициализируются 1, второй строки

    2 и т. д. Заметим, что списки инициализаторов третьей и четвертой строк

    заканчиваются запятой. Последний список инициализаторов { 4, 4, 4,} также

    заканчивается запятой.

    Эти дополнительные запятые допускаются, но не требуются. Требуются

    только те запятые, которые разделяют константные выражения и списки

    инициализации. Если список инициализаторов не структурирован под

    составной об"ект, то его величины присваиваются в том порядке, в котором

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

    эквивалентна следующей:

    int p[4] [3] = {

    1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4

    };

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

    инициализаторов в списке.

    Когда инициализируются составные переменные, то нужно позаботиться о

    том, чтобы правильно использовать фигурные скобки и списки

    инициализаторов. В следующем примере иллюстрируется более детально

    интерпретация компилятором фигурных скобок.

    typedef struct {

    int n1, n2, n3;

    } triplet;

    triplet nlist[2] [3] = {

    { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }, /* Line 1 */ { {

    10,11,12}, { 13,14,15}, { 15,16,17} } /* Line 2 */

    };

    В примере nlist об"является как массив структур, состоящий из двух

    строк и трех столбцов. Каждая структура состоит из трех элементов.

    Первая строка инициализации назначает величины первой строке массива nlist

    следующим образом:

    1. Первая левая фигурная скобка Line 1 информирует компилятор о том, что

    это начало инициализации первой строки массива nlist(nlist[0]).

    2. Вторая левая фигурная скобка означает то, что начинается

    инициализация первого элемента первой строки массива ( nlist[0] [0] ).

    3. Первая правая фигурная скобка сообщает об окончании инициализации

    первого элемента- структуры nlist[0] [0]. Следующая левая фигурная

    скобка сообщает о начале инициализации второго элемента первой строки

    nlist[0] [1].

    4. Процесс продолжается до конца Line 1 и заканчивается по последней

    правой фигурной скобке.

    Аналогично, Line 2 назначает величины второй строке массива nlist.

    Заметим, что внешние фигурные скобки инициализаторов Line 1 и Line 2

    требуются. Следующая конструкция, в которой внешние фигурные скобки опущены

    будет неверной.

    /* THIS CAUSES AN ERROR */

    triplet nlist[2] [3] = {

    { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 }, /* Line 1 */

    { 10,11,12}, { 13,14,15}, {16,17,18 } /* Line 2 */

    };

    В этом примере первая левая фигурная скобка в Line 1 стартует

    инициализацию nlist[0], которая является массивом из трех структур.

    Величины 1, 2, 3 назначаются трем элементам первой структуры. Когда

    встретится правая фигурная скобка (после величины 3), инициализация

    nlist[0] закончится и две оставшиеся структуры автоматически

    инициализируются нулем. Аналогично, { 4, 5, 6 } инициализирует первую

    структуру во второй строке nlist, а оставшиеся две структуры nlist[1]

    установятся в нуль. Когда компилятор встретит следующий список

    инициализации { 7, 8, 9 }, то это приведет к попытке инициализировать

    nlist[2]. Так как nlist содержит только две строки, то будет выдано

    сообщение об ошибке.

    Примеры:

    /******************* Example 1 *********************/

    struct list {

    int i, j, k;

    float n[2] [3];

    } x = {

    1,

    2,

    3,

    {4.0, 4.0, 4.0}

    };

    /******************* Example 2 *********************/

    union {

    char x[2] [3];

    int i, j, k;

    } y = {

    {'1'},

    {'4'}

    };

    В первом примере три элемента int структурной переменной x

    инициализированы 1, 2, и 3 соответственно. Три элемента первой строки

    массива m инициализированы как 4.0. Элементы второй строки инициализированы

    нулем по умолчанию.

    Во втором примере инициализируется переменная y типа совмещения. Первым

    элементом совмещения является массив, для которого требуется составной

    инициализатор. Список инициализации {'1'} задает величины для первой строки

    массива. Поскольку в списке всего одна величина, то только первый элемент

    строки массива инициализируется символом 1 , а оставшиеся два элемента в

    строке инициализируются нулем (символом \0) по умолчанию. Аналогично,

    первый элемент второй строки массива x инициализируется символом 4, а

    оставшиеся два элемента в строке инициализируются нулем.

    Строковые инициализаторы

    Массив может быть инициализирован строчным литералом.

    Например,

    char code[ ] = "abc";

    инициализирует code как массив символов из четырех элементов. Четвертым

    элементом является символ \0, который завершает все строковые литералы.

    Если специфицируется размер массива, а строка больше чем

    специфицированный размер, то лишние символы отбрасываются. Следующее

    об"явление инициализирует переменную code, как трехэлементный массив

    символов:

    char code[3] = "abcd"

    В примере только три первые символа инициализатора назначаются для

    массива code. Символ d и сивол нуль отбрасываются.

    Если строка короче, чем специфицированный размер массива, то

    оставшиеся элементы массива инициализируются нулем (символом \0).

    Об"явления типов

    Об"явление типа определяет имя и элементы структурного или совмещающего

    типов или имя и перечислимое множество перечислимого типа.

    Имя типа может быть использовано в об"явлениях переменных и функций в

    качестве ссылки на этот тип. Это полезно, когда многие переменные или

    функции имеют один и тот же тип.

    Об"явление typedef определяет спецификатор типа для типа. Это

    об"явление используется для того, чтобы создавать более короткие или

    более осмысленные имена типов уже определенных в Си или об"явленных

    пользователем.

    Типы структур, совмещений и перечислений

    Об"явления типов структур, совмещений и перечислений имеют ту же самую

    общую синтаксическую форму, как и об"явления переменных этих типов. В

    об"явлении типа идентификатор переменной опущен, так как нет переменной

    которая об"является. Именем структуры, совмещения или перечисления

    является тег.

    В об"явлении типа может появиться список об"явлений элементов-

    или список перечисления-

    , определяющие тип.

    Сокращенная форма об"явления переменной, в котором tag ссылается на тип,

    определенный где-то еще, при об"явлении типа не используется.

    Примеры:

    /******************** Example 1 ********************/

    enum status {

    loss = -1,

    bye,

    tie = 0,

    win,

    };

    /********************* Example 2 *******************/

    struct student {

    char name[20];

    int id, claas;

    };

    В первом примере об"является тип перечисления, поименованный status.

    Имя типа может быть использовано в об'явлениях перменных типа

    перечисления. Идентификатор loss явно устанавливается в -1.

    Идентификаторы bye и tie ассоциируются со значением 0, а win принимает

    значение 1. Во втором примере об"является структурный тип, поименованный

    student. Теперь можно использовать такое об"явление, как struct student

    employee, чтобы об"явить структур-

    ную переменную employee типа student.

    Об"явления typedef

    Синтаксис:

    typedef [,...]; Об"явления

    typedef являются аналогом об"явления переменной,

    за исключением того, что ключевое слово typedef заменяет спецификатор

    класса памяти.

    Об"явление интерпретируется тем же самым путем, как об"явления

    переменной или функции, но вместо того, чтобы стать

    Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11


    Приглашения

    09.12.2013 - 16.12.2013

    Международный конкурс хореографического искусства в рамках Международного фестиваля искусств «РОЖДЕСТВЕНСКАЯ АНДОРРА»

    09.12.2013 - 16.12.2013

    Международный конкурс хорового искусства в АНДОРРЕ «РОЖДЕСТВЕНСКАЯ АНДОРРА»




    Copyright © 2012 г.
    При использовании материалов - ссылка на сайт обязательна.