C. Бочков - Язык программирования Си для персонального компьютера
Можно объявить несколько переменных в одном объявлении, задавая список <идентификаторов>, разделенных запятыми. Каждый <идентификатор> в списке именует отдельную переменную. Все переменные, заданные в таком объявлении, имеют одинаковый тип.
Примеры.
int х; /* пример 1 */
unsigned long reply, flag; /* пример 2 */
double order; /* пример 3 */
В первом примере объявляется простая переменная х. Эта переменная может принимать любое значение из области значений типа int.
Во втором примере объявлены две переменные: reply и flag. Обе переменные имеют тип unsigned long.
В третьем примере объявлена переменная order, которая имеет тип double. Этой переменной могут быть присвоены значения с плавающей точкой.
Объявление переменной перечислимого типа
Синтаксис:
enum [<тег>]{<список-перечисления>} <описатель>[,<описатель>…];
enum <тег> <идентификатор> [<идентификатор>…];
Объявление переменной перечислимого типа задает имя переменной и определяет список именованных констант, называемый списком перечисления. Каждому элементу списка перечисления ставится в соответствие целое число. Переменная перечислимого типа может принимать только значения из своего списка перечисления. Элементы списка имеют тип int. Поэтому переменной перечислимого типа выделяется ячейка памяти, необходимая для размещения значения типа int. Перечислимый тип, таким образом, представляет собой подмножество целого типа. Над объектами перечислимого типа определены те же операции, что и над объектами целого типа.
<Описатель> специфицирует либо переменную перечислимого типа, либо указатель на значение перечислимого типа, либо массив элементов перечислимого типа, либо функцию, возвращающую значение перечислимого типа, либо более сложный объект, являющийся комбинацией перечисленных типов.
Объявление переменной перечислимого типа начинается с ключевого слова enum и имеет две формы представления.
В первой форме задается список перечисления, содержащий именованные константы. Необязательный <тег> — это идентификатор, который именует перечислимый тип, специфицированный данным списком перечисления, <идентификатор> — это имя переменной перечислимого типа. В одном объявлении может быть описано более одной переменной данного перечислимого типа.
Во второй форме объявления список перечисления отсутствует, однако используется <тег>, который ссылается на перечислимый тип, объявленный в другом месте программы. Если заданный тег ссылается на неизвестный перечислимый тип либо область действия определения этого перечислимого типа не распространяется на текущий блок, то компилятор языка Си сообщает об ошибке. Допускаются объявление указателя на перечислимый тип и объявление typedef для перечислимого типа, использующие тег ранее не определенного перечислимого типа. Однако этот тип должен быть определен к моменту использования этого тега или типа, объявленного посредством typedef.
<Список-перечисления> содержит одну или более конструкций вида:
<идентификатор> [=<константное-выражение>]
Конструкции в списке разделяются запятыми. Каждый <идентификатор> именует элемент списка перечисления. По умолчанию, если не задано <константное-выражение>, первому элементу присваивается значение 0, следующему элементу—значение 1 и т. д. Элемент списка перечисления является константой.
Запись =<константное-выражение> изменяет умалчиваемую последовательность значений. Элемент, идентификатор которого предшествует записи =<константное-выражение>, принимает значение, задаваемое этим константным выражением. Константное выражение должно иметь тип int и может быть как положительным, так и отрицательным. Следующий элемент списка получает значение, равное <константное-выражение>+1, если только его значение не задается явно другим константным выражением.
В списке перечисления могут содержаться элементы, которым сопоставлены одинаковые значения, однако каждый идентификатор в списке должен быть уникальным. Например, двум различным идентификаторам null и zero может быть задано значение 0 в одном и том же списке перечисления. Кроме того, идентификатор элемента списка перечисления должен быть отличным от идентификаторов элементов всех остальных списков перечислений с той же областью действия, а также от других идентификаторов с той же областью действия (см. раздел 2.5). Тег перечислимого типа должен быть отличным от тегов других перечислимых типов, структур и объединений с той же самой областью действия.
Примеры.
/* пример 1 */
enum day {
SATURDAY,
SUNDAY = 0,
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY
} workday;
/* пример 2 */
enum day today = WEDNESDAY;
В первом примере перечислимый тип определяется списком. Перечислимый тип именуется тегом day, и объявляется переменная workday этого перечислимого типа. С элементом SATURDAY по умолчанию ассоциируется значение 0. Элементу SUNDAY явно присваивается значение ноль. Остальные идентификаторы по умолчанию принимают значение от 1 до 5.
Во втором примере переменная перечислимого типа today инициализируется значением одного из элементов списка перечисления. Так как перечислимый тип с тегом day был предварительно объявлен, то при объявлении today достаточно сослаться только на тег day, не записывая повторно сам список перечисления.
Примечание. В языке Си принято записывать имена элементов перечисления прописными буквами, однако это необязательно.
Объявление структуры
Структура позволяет объединить в одном объекте совокупность значений, которые могут иметь различные типы. Однако в языке Си реализован очень ограниченный набор операций над структурами как единым целым: передача функции в качестве аргумента, возврат в качестве значения функции, получение адреса. Можно присваивать одну структуру другой, если они имеют одинаковый тег.
Синтаксис:
struct [<тег>] {<список-объявлений-элементов>} <описатель> [,<описатель>…];
struct <тег> <описатель> [,<описатель>…];
Объявление структуры может задавать имя структурного типа и/или последовательность объявлений переменных, называемых элементами структуры. Эти элементы могут иметь различные типы.
Объявление структуры начинается с ключевого слова struct и имеет две формы записи, как показано выше. В первой форме типы и имена элементов структуры специфицируются в списке объявлений элементов. Необязательный в данном случае <тег> — это идентификатор, который именует структурный тип, определенный данным списком объявлений элементов.
<Описатель> специфицирует либо переменную структурного типа, либо указатель на структуру данного типа, либо массив структур данного типа, либо функцию, возвращающую структуру данного типа, либо более сложный объект, являющийся комбинацией перечисленных типов.
Вторая синтаксическая форма объявления использует тег структуры для ссылки на структурный тип, определенный где-то в другом месте программы. В этой форме объявления список объявлений элементов отсутствует. Объявление должно находиться в области действия данного тега, т. е. определение структурного типа, именованного тегом, должно предшествовать объявлению, использующему этот тег, за исключением двух случаев: когда тег используется для объявления либо указателя на структуру, либо структурного типа в typedef. Однако при этом определение структурного типа должно предшествовать использованию данного указателя либо типа, объявленного посредством typedef.
Список объявлений элементов представляет собой последовательность из одного или более объявлений переменных или битовых полей (см. ниже). Каждая переменная, объявленная в этом списке, называется элементом структуры. Особенность синтаксиса объявлений переменных в списке состоит в том, что они не могут содержать спецификаций класса памяти и инициализаторов. Элементы структуры могут иметь базовый тип, либо быть массивом, указателем, объединением или, в свою очередь, структурой.