АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

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

Читайте также:
  1. А. Составные части
  2. Вопрос 7. Система Российских стандартов по охране природы, ее составные части.
  3. Вопрос№7. Составные части композиции теле-ого сценариа.
  4. Глагольные односоставные предложения и их типы
  5. Здоровье духовное и физическое — составные части индивидуального здоровья человека.
  6. Общие сведения (внешний вид, составные части).
  7. Программа социологического исследования и ее составные части.
  8. Простые и сложные рефлекторные дуги, составные элементы. Нейронная теория, и её основоположники.
  9. Различия с русским языком: составные предметы.
  10. Сложносоставные субъекты Российской Федерации.
  11. Составные деклараторы
  12. Составные компоненты экосистем

Синтаксис:

={<initializer-list>}

Список инициализаторов <initializer-list> - это последова­тельность инициализаторов, разделенных запятыми. Каждый инициали­затор в последовательности- это либо константное выражение, либо список инициализаторов. Поэтому, заключенный в фигурные скобки список, может появиться внутри другого списка инициализации. Эта конструкция используется для инициализации элементов составных конструкций.

Для каждого списка инициализации значения константных выра­жений присваиваются в порядке следования элементов составной пе­ременной. Когда инициализируется совмещение, то список инициали­заторов представляет собой единственное константное выражение. Величина константного выражения присваивается первому элементу совмещения.

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

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

Пример:

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, а оставшиеся два элемента в строке инициализируются нулем.


1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.005 сек.)