близкие характеристики и представляется естественным допускать их совместное применение в одной операции, позволяя компилятору выполнять автоматическое преобразование одного типа в другой. Однако наличие чрезмерно большого количества автоматических преобразований типов, характерное для языка Си, может усложнять использование языка.
В соответствии с одной из систем классификации все типы языка Си делят на следующие четыре категории:
●function,
●void,
●скалярные,
●агрегатные.
Остановимся вначале кратко на каждой из четырех категорий типов. Понятие типа обычно связывают с данными. Особенностью системы
типов языка Си является то обстоятельство, что объявление функций строится по тем же правилам, что и объявления данных. Объявление функции используется компилятором и программистом. Компилятору объявление позволяет корректно выполнить компиляцию вызова функции. Программисту объявление функции позволяет правильно обратиться к функции, т. е. правильно написать вызов функции. Примеры объявлений функций можно найти в справочных материалах к используемому вами компилятору.
Следует отметить, что void является зарезервированным словом. Оно используется для следующих целей:
●В качестве типа значения, возвращаемого функцией. Если из заголовка функции следует, что типом значения, которое она возвращает, является void, то это означает, что функция не возвращает значения. В этом случае она может использоваться подобно процедуре такого языка, как Паскаль.
●Зарезервированное слово void в языке используется для указания на то обстоятельство, что функция не имеет параметров.
Вкачестве примера применения типа void может служить объявление библиотечной функции clrscr(), которая не имеет возвращаемого значения и
не принимает параметров: void clrscr(void);
Каждое данное, относящееся к категории скалярных типов, характеризуется только одним значением. Данные, относящиеся к категории агрегатных типов, характеризуется некоторой совокупностью значений. Остановимся вначале на категории скалярных типов.
В стандарте языка С99 к скалярным типам относятся следующие виды типов:
● арифметические,
11
●логический,
●указатели,
●перечисления.
Логический тип появился только в стандарте С99. В связи с тем, что многие компиляторы его еще не поддерживают, этот тип не будет рассматриваться в настоящем пособии.
Арифметические типы составляют большую группу типов. В ней можно выделить три части:
●целые,
●вещественные,
●комплексные.
Комплексные типы появились только в стандарте С99. В связи с тем, что многие компиляторы его еще не поддерживают, этот тип не будет рассматриваться в настоящем пособии.
Каждая из оставшихся разновидностей арифметических типов включает в себя достаточно большое количество отдельных типов. К числу основных (базовых) арифметических типов относят следующие типы. Для целочисленных типов базовыми типами считаются типы char и int, а для вещественных типов – float и double. Обращает на себя внимание тот факт, что символьный тип (тип char) в языке Си рассматривается как разновидность целочисленного типа. Это обстоятельство можно рассматривать как проявление ослабленной типизации, которое присуще языку Си.
Базовые арифметические типы могут быть модифицированы. Для целей модификации служит ряд зарезервированных слов, к числу которых относятся:
●signed (знаковый),
●unsigned (беззнаковый),
●long (длинный),
●short (короткий).
Сучетом модификаторов можно написать 17 разновидностей арифметических типов.
Основным целочисленным типом в языке Си является тип int. Это аппаратно-зависимый тип. Размер, который занимает данное, относящееся к этому типу, зависит от размера машинного слова конкретной среды программирования.
Указатели являются специальным видом данных. Особенность указателя состоит в то, что его значением является адрес памяти, начиная с которого хранится данное. Указатели будут подробно рассматриваться во второй части пособия. В этой части пособия указатели рассматриваются только в объеме, необходимом для грамотной работы с библиотечными функциями.
Перечислимый тип является взаимосвязанным набором целочисленных констант. Перечислимые типы будут рассматриваться во второй части пособия.
12
К категории агрегатных типов, с которыми можно работать в языке Си, относятся следующие типы:
●массивы,
●структуры,
●объединения.
Объект – это термин, ориентированный на работу с оперативной памятью компьютера. Под объектом в языке Си понимается участок оперативной памяти компьютера, в котором хранится некоторое значение. Одни данные в языке Си являются объектами, другие – объектами не являются. К объектам относятся переменные (кроме регистровых переменных). Литералы (константы) к объектам не относятся. К объектам также не относятся символические константы, объявляемые с помощью директивы define
Замечание. Возникает следующий вопрос, каким образом можно отличить данные, являющиеся объектом от данных таковыми не являющихся? Для ответа на этот вопрос к этому данному следует применить оператор взятия адреса (&). Такая операция может использоваться только для объектов, а для данных, не являющихся объектами, эта операция оказывается недопустимой.
Программа, написанная на языке Си, состоит из отдельных предложений. Предложения в свою очередь состоят из лексем. Лексемы играют роль “кирпичиков”, из которых строятся предложения языка. Лексемы неделимы и сами по себе определяют некоторое содержание. В языке Си различают следующие виды лексем:
●Зарезервированные слова.
●Идентификаторы.
●Литералы
●Разделители (знаки пунктуации).
●Операторы.
Зарезервированные слова и идентификаторы играют роль слов в предложениях программы, написанной на языке Си. Литералы применяются для обозначения фиксированных значений данных, используемых в программе.
Операторы применяются для обозначения операций, предусмотренных языком программирования. Например, оператор “+” используется для обозначения операции сложения двух чисел.
Кразделителям относятся следующие лексемы: “[“, “]”, “(“, “)” и другие.
Зарезервированные слова имеют фиксированный смысл, который закреплен за ними определением языка, Этот смысл не может быть изменен
13
программистом. В связи с этим зарезервированные слова не могут использоваться в качестве слов пользователя, к которым относятся идентификаторы (смотри ниже). Не будем перечислять все зарезервированные слова, предусмотренные языком Си. Будем вводить эти слова по мере необходимости.
Идентификатор – это конструкция языка, используемая для целей наименования. Идентификаторы выбираются программистом по своему усмотрению, но с учетом синтаксиса языка. В языке Си в качестве идентификатора может использоваться любая последовательность цифр и букв, которая начинается с буквы. Символ подчеркивания считается буквой. Следует учитывать, что идентификаторы языка Си чувствительны к регистру. Стандарт языка Си не ограничивает длину идентификатора. Ограничивается количество значащих символов в идентификаторе. В соответствии со стандартом C89 количество значащих символов в идентификаторе равно 31, а в стандарте С99 – 63 символа.
В языке Си существует традиция записывать имена переменных строчными символами, а имена символических констант, которые определены с помощью директивы define, – заглавными.
Во избежание возможных конфликтов с именами, зарезервированными для системных целей, рекомендуется не начинать пользовательские имена с двух подчёркиваний и подчёркивание, за которым следует заглавная буква.
Примеры корректных идентификаторов:
Number
number /* Идентификаторы Number и number – это два разных идентификатора */
_number |
/* Идентификатор состоит из двух смысловых |
count_words |
|
|
частей (слов), разделенных символом |
number_ |
подчеркивания*/ |
|
for |
Примеры некорректных идентификаторов: |
||
|
/* совпадает с зарезервированным словом */ |
||
1_st_slovo |
/* |
начинается с цифры */ |
|
super+ |
/* |
содержит недопустимый символ*/ |
|
Примеры идентификаторов, которые могут конфликтовать с системными идентификаторами
_Name |
/* |
Начинается с |
символа подчеркивания, |
__file |
за которым следует заглавная буква */ |
||
/* |
Начинается с |
двух подряд следующих |
|
|
символов подчеркивания */ |
||
14
Литералы или константы предназначены для представления фиксированных значений. В языке Си различают две категории констант:
●Явные константы или литералы
●Символические константы.
Явная константа – это константа, тип и значение которой определяются ее записью. Явные константы в языке Си часто называют литералами. Литерал относится к категории лексем. Особенность литералов состоит в том, что они не являются объектами. Например, 2 – это явная константа (литерал) целого типа.
Символическая константа в программе представлена своим именем. При выборе этого имени следует руководствоваться соображениями повышения читабельности программы. С учетом этого имя символической константы должно раскрыть ее назначение. Символическую константу в языке Си можно определить, например, с помощью директивы препроцессора define. В данном разделе рассматриваются только явные константы. Рассмотрим константы, относящиеся к различным типам данных. Начнем с целочисленных констант.
Целочисленные литералы служат для представления привычных из математики целых чисел. Прежде всего, следует учитывать, что в языке Си имеются три разновидности целочисленных литералов, которые различаются используемой системой счисления. Программист имеет возможность при записи целочисленных литералов воспользоваться следующими системами счисления:
●Восьмеричной,
●Десятичной,
●Шестнадцатеричной.
По умолчанию используется десятичная система счисления. Для указания на систему счисления, отличную от десятичной системы, литерал должен быть снабжен префиксом. Для указания на восьмеричную систему счисления следует в качестве такого префикса использовать цифру нуль, а для работы с шестнадцатеричной системой следует использовать один из двух возможных префиксов: 0x или 0X.
В связи с тем, что существует значительное количество разновидностей данных целого типа, целочисленный литерал может содержать суффикс для указания на тип значения, им определяемого. В языке Си используется следующие суффиксы:
●Для литералов, относящихся к типу long, - символ l или L,
●Для литералов, относящихся к типу long long, – символы ll или LL,
●Для литералов, относящихся к беззнаковым типам – символ u или U. Суффиксы, относящиеся к беззнаковым типам, могут комбинироваться с
суффиксами, используемыми при записи литералов типа long и long long.
15