Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ИДЗ 1 Вариант 8.doc
Скачиваний:
13
Добавлен:
20.06.2014
Размер:
131.58 Кб
Скачать

1.4. Объединения

И Паскаль, и Си содержат сходное понятие, называемое: в Паскале - переменная (вариантная) структура записи, a в Си – union (объединение). Конкретные способы его описания показаны в примере:

Турбо Паскаль Турбо Си

type

<uname>=record union <uname>{

<fieldlist> <type><fnames>;

case<type> of <type><fnames>;

<vlist> :(<fieldlist>) ...

<vlist> :(<fieldlist>) <type><fnames>;

... };

<vlist> :(<fiedlist>)

end;

B Паскале <fiedlist> является обычной записью последовательностей <fname>:<type>;, повторяемой нужное количество раз.

Два основных различия между Паскалем и Си в следующем:

1) Паскаль заставляет положить объединение в основу регулярной записи, а Си - нет. Однако, вы можете сначала объявить объединение, а затем указать поле в структуре, принадлежащее типу, описанному в объединении.

2) Паскаль позволяет вам иметь множество типов для каждого варианта в объединении. Си позволяет иметь множество полей (<fnames>), но все должны быть одного типа.

Вот образец, написанный в Паскаль и Си версиях, как можно ближе к друг другу (однако, можно допустить, что они не вполне идентичны).

Турбо Паскаль Турбо C

type typedef union {

trick_word=record int w;

case integer of struct {

0:(w:integer); char lob;

1:(lob,hib:byte); char hib;

end; } b;

var xp:trick_word; } trick_word;

trick_word xc;

Примечание: определение trick_word ни в Си, ни в Паскале непереносимо. Они оба зависят от порядка байт 8086.

В Си объединении, как и в структуре, вы можете вставить поле <vnames> между закрытой скобкой и точкой с запятой, чтобы прямо указать переменные того типа. В этом операторе выбора вы можете оставить свободным <vnames>, если вы не собираетесь указывать больше таких переменных. Полями ссылок в Паскале являются: xp.w, xp.hib и xp.lob, а в Си - xc.w, xc.b.hib и xc.b.lob.