В некоторых случаях спецификация класса памяти и/или спецификация типа может быть опущена.
Все переменные в языке Си должны быть явно объявлены перед их использованием, за исключением формальных параметров, имеющих тип int. Функции могут быть объявлены явно, посредством задания объявления или определения функции, либо неявно, если их вызов следует до определения или объявления.
Спецификация класса памяти влияет на то, в какой области памяти хранится объявляемый объект, производится ли его неявная инициализация и на какие участки программы распространяется его область действия. Местоположение объявления в программе, а также наличие или отсутствие других объявлений этой же переменной также существенны при определении ее области действия. Классы памяти описаны в разделе 3.6.
В языке Си определен набор базовых типов данных. Новые типы данных можно добавлять к этому набору посредством их объявления на основе уже определенных типов данных. Спецификация типа позволяет задавать для объекта либо базовый тип данных (см. раздел 3.1), либо структурный тип (см. раздел 3.4.3), либо тип объединение (см. раздел 3.4.4).
Не считается ошибкой объявление внешнего уровня, в котором отсутствует и спецификация класса памяти, и спецификация типа. В этом случае предполагается тип int. Однако объявление, состоящее только из идентификатора, например
n;
недопустимо, т.е. простая переменная не может быть объявлена подобным образом; может быть объявлен указатель, массив или функция.
Объявление должно содержать один или более описателей. В простейшем случае, когда объявляется простая переменная, тип которой задан <
Определения функций описаны в разделе 6.2, инициализаторы — в разделе 3.7.
Базовые типы данных
В языке Си реализован набор типов данных, называемых "базовыми" типами. Спецификации этих типов перечислены в таблице 3.1.
Таблица 3.1.
Базовые типы | Спецификация типов | |
Целые | signed char | знаковый символьный |
signed int | знаковый целый | |
signed short int | знаковый короткий целый | |
signed long int | знаковый длинный целый | |
unsigned char | беззнаковый символьный | |
unsigned int | беззнаковый целый | |
unsigned short int | беззнаковый короткий целый | |
unsigned long int | беззнаковый длинный целый | |
Плавающие | float | плавающий одинарной точности |
double | плавающий двойной точности | |
long float | длинный плавающий одинарной точности | |
long double | длинный плавающий двойной точности | |
Прочие | void | пустой |
enum | перечислимый |
Тип long float реализован только в версии 4.0 СП MSC и эквивалентен типу double. В версии 5.0 СП MSC и в СП ТС реализован тип long double, причем в версии 5.0 СП MSC и версии 1.5 СП ТС он эквивалентен типу double, а в версии 2.0 СП ТС является самостоятельным типом размером 80 битов.
Типы char, int, short и long имеют две формы — знаковую (signed) и беззнаковую (unsigned). В совокупности они образуют целый тип. Перечислимый тип также служит для представления целых значений, однако, переменная перечислимого типа может принимать значения только из набора, заданного в ее объявлении. Спецификации типов float и double относятся к плавающему типу.
Целый тип (включая перечислимый тип) и плавающий тип в совокупности образуют арифметический тип.
Тип void (пустой) имеет специальное назначение. Указание спецификации типа void в объявлении функции означает, что функция не возвращает значений. Указание типа void в списке объявлений аргументов в объявлении функции означает, что функция не принимает аргументов. Можно объявить указатель на тип void; он будет указывать на любой, т.е. неспецифицированный тип. Тип void может быть указан в операции приведения типа. Приведение значения выражения к типу void явно указывает на то, что это значение не используется. Нельзя объявить переменную типа void.