Объединения

Объединения подобны структурам. Но в каждый момент времени может использоваться (или являться активным) только один из его компонентов.

Объединение может быть задано следующим шаблоном:

union {

описание компонента 1;

описание компонента 2;

}

Для каждого их этих компонентов выделяется одна и та же область памяти.

Доступ к компонентам объединения осуществляется также как и к элементам структуры.

Примеры:

union {

float radius; окружность

float a[2]; прямоугольник

int b[3]; треугольник

position p;

} geom_fig;

Объединения применяются для: минимизации используемого объема памяти, если в каждый момент времени только один объект из многих является активным.

2 Оператор описания типа

Используется для того, чтобы все свойства объекта собрать в одном месте и присвоить им имя. Это имя типа может затем использоваться для последующих описаний других объектов.

Описания типа имеет следующую форму:

typedef спецификатор типа имя нового типа;

спецификатор типа – основной или производный тип, или тип, ранее определенный программистом.

Примеры:

typedef float miles, speed;

имена miles и speed описаны как синонимы для имени float.

typedef float a[5], *p;

typedef struct {float x, y;}point;

С помощью этих типов можно определять объекты точно так же, как с помощью типов float и int. Например так

point s1, s2, *p;

3 Преобразование типов

Значения могут быть преобразованы из одного типа в другой. Такое преобразование может быть неявным или явным.

3.2.1 Неявные преобразования

Применяются для согласования аргументов оператора или функции со значениями, которые предполагаются в этих операторах или функциях (при выполнении арифметических операций, при выполнении операций присваивания, если значение одного типа присваивается переменной другого типа, при передаче аргументов функции).

При этом:

char может быть преобразован в int, short int, long int.

int в – char, short int, long int (преобразование к целому большей длины включает расширение знакового разряда, преобразование к целому меньшей длины вызывает отбрасывание лишних старших разрядов). Также в float, double.

short – аналогичен типу int.

long – аналогичен типу int.

float – double, также int, short, long (машинно-зависимое преобразование, если преобразуемое значение слишком велико, то результат не определен).

double – float, а также int, short, long также как и float.

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

В арифметических операциях. Арифметические операторы в языке СИ преобразуют операнды к соответствующим типам автоматически, если операнды не имели таких типов с самого начала. Схема преобразования называется обычными арифметическими преобразованиями. Она может быть описана следующими правилами:

- Операнды типов char и short преобразуется к типу int, операнды типа float преобразуется к типу double.

- Если хотя бы один из операндов имеет тип double, то и другой операнд преобразуется к типу double, результат имеет тип double.

- Если хотя бы один операнд имеет тип long, то и другой операнд преобразуется к типу long, результат имеет тип long.

- Если хотя бы один операнд имеет тип unsigned, то и другой операнд преобразуется к типу unsigned, результат имеет тип unsigned.

- Если ни один из случаев перечисленных выше не имеет место, то оба операнда должны иметь тип int, такой же тип будет и у результата.

Преобразования при вызове функции. Преобразования, выполняемые над аргументами при вызове функции, зависят от того, был ли задан прототип функции (объявление "вперед") со списком объявлений типов аргументов.

Если задан прототип функции и он включает объявление типов аргументов, то над аргументами в вызове функции выполняются только обычные арифметические преобразования.



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: