Лекции по C++

Информация - Компьютеры, программирование

Другие материалы по предмету Компьютеры, программирование

правая фигурная скобка сообщает об окончании инициализации первого элемента- структуры 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 заменяет спецификатор класса памяти.

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