Каждая целая константа специфицируется типом, определяющим ее представление в памяти и область значений. Десятичные константы могут быть типа int или long.
Восьмеричные и шестнадцатеричные константы в зависимости от размера могут быть типа int, unsigned int, long или unsigned long. Если константа может быть представлена как int, она специфицируется типом int. Если ее величина больше, чем максимальная положительная величина, которая может быть представлена типом int, но меньше величины, которая представляется в том же самом числе бит как и int, она задается типом unsigned int. Наконец, константа, величина которой больше чем максимальная величина, представляемая типом unsigned int, задется типом long или unsigned long, если это необходимо.
Важность рассмотренных выше правил состоит в том, что восьмеричные и шестнадцатеричные константы не содержат "знаковых" расширений, когда они преобразуются к более длинным типам (преобразование типов смотри в разделе 5 "Выражения и присваивания").
Программист может определить для любой целой константы тип long, приписав букву "l" или "L" в конец константы. В Табл. 2.6 показаны примеры целых констант.
Константа с плавающей точкой- это действительное десятичное положительное число. Величина действительного числа включает целую, дробную части и экспоненту. Константы с плавающей точкой имеют следующий формат представления:
[<digits>][.<digits>][E[-]<digits>],
где <digits> - одна или более десятичных цифр (от 0 до 9),а E или e -символ экспоненты. Целая или дробная части константы могут быть опушены, но не обе сразу. Десятичная точка может быть опущена только тогда, когда задана экспонента.
Экспонента состоит из символа экспоненты, за которым следует целочисленная величина экспоненты, возможно отрицательная.
Пробельные символы не могут разделять цифры или символы константы.
Константы с плавающей точкой всегда специфицируют положительные величины. Если требуются отрицательные величины, то необходимо сформировать константное выражение из знака минус и следующей за ним константы. Знак минус рассматривается как арифметическая операция.
Примеры констант с плавающей точкой и константных выражений:
15.75
1.575E1
1575e-2
-0.0025
-2.5e-3
25e-4
Целая часть константы с плавающей точкой может быть опущена, например:
.75
.0075e2
-.125
-.175E-2
Все константы с плавающей точкой имеют тип double.
Константа-символ- это буква, цифра, знак пунктуации или ESC- символ, заключенные в одиночные кавычки. Величина константы-символа равна значению представляющего ее кода символа.
Константа-символ имеет следующую форму представления:
'<char>',
где <char> может быть любым символом иэ множества представимых символов, включая любой ESC- символ, исключая одиночную кавычку ('), наклонную черту влево (\) и символ новой строки.
Чтобы использовать одиночную кавычку или наклонную черту влево в качестве константы-символа, необходимо вставить перед этими знаками наклонную черту влево. Чтобы представить символ новой строки, необходимо использовать запись '\n'.
Константы-символы имеют тип int.
Строковый литерал- это последовательность букв, цифр и символов, заключенная в двойные кавычки. Строковый литерал рассматривается как массив символов, каждый элемент которого представляет отдельный символ. Строковый литерал имеет следующую форму представления:
"<characters>" ,
где <characters> - это нуль или более символов из множества представимых символов, исключая двойную кавычку ("), наклонную черту влево (\) и символ новой строки. Чтобы использовать символ новой строки в строковом литерале, необходимо напечатать наклонную черту влево, а затем символ новой строки.
Наклонная черта влево вместе с символом новой строки будут проигнорированы компилятором , что позволяет формировать строковые литералы, располагаемые более чем в одной строке. Например, строковый литерал:
"Long strings can be bro\
cken into two pieces."
идентичен строке:
"Long strings can be brocken into two pieces."
Чтобы использовать двойные кавычки или наклонную черту влево внутри строкового литерала, нужно представить их с предшествующей наклонной чертой влево, как показано в следующем примере:
"This is a string literal"
"First \ Second"
"\"Yes, I do,\" she said."
"The following line shows a null string:"
""
Заметим, что ESC- символы (такие как \ и \") могут появляться в строковых литералах. Каждый ESC- символ считается одним отдельным символом.
Символы строки запоминаются в отдельных байтах памяти. Символ null (\0) является отметкой конца строки. Каждая строка в программе рассматривается как отдельный объект. Если в программе содержатся две идентичные строки, то каждая из них будет храниться в отдельном месте памяти.
Строчные литералы имеют тип char[]. Под этим подразумевается, что строка- это массив, элементы которого имеют тип char. Число элементов в массиве равно числу символов в строчном литерале плюс один, поскольку символ null (отметка конца строки) тоже считается элементом массива.
Идентификаторы- это имена переменных, функций и меток, используемых в программе. Идентификатор создается объявлением соответствующей ему переменной или функции.После этого его можно использовать в последующих операторах программы. Идентификатор- это последовательность из одной или более букв, цифр или подчерков(_), которая начинается с буквы или подчерка. Допускается любое число символов в идентификаторе, однако только первые 31 символ распознаются компилятором. (Программы, использующие результат работы компилятора, такие как, линкер, могут распознавать меньшее число символов).
При использовании подчерков в идентификаторе нужно быть осторожным, поскольку идентификаторы, начинающиеся с подчерка могут совпадать (войти в конфликт) с именами "скрытых" системных программ.
Примеры идентификаторов:
temp1
toofpage
skip12
Компилятор Си рассматривает буквы верхнего и нижнего регистров как различные символы. Поэтому можно создать отдельные независимые идентификаторы, которые совпадают орфографически, но различаются большими и малыми буквами. Например, каждый из следующих идентификаторов является уникальным:
add
ADD
Add
aDD
Компилятор Си не допускает идентификаторов, которые имеют ту же самую орфографию, что и ключевые слова. Ключевые слова описаны в следующем раздела
Замечание:
По сравнению с компилятором, сборщик может в большей степени ограничивать количество и тип символов для глобальных идентификаторов, и в отличие от компилятора не делать различия между большими и малыми буквами. (Подробнее смотри руководство по пакету MSC).
Ключевые слова- это предопределенные идентификаторы, которые имеют специальное значение для компилятора Си. Их можно использовать только так как они определены. Имена объектов программы не могут совпадать с названиями ключевых слов.
Список ключевых слов:
auto double int struct
break else long switch
case enum register typedef
char extern return union
const float short unsigned
continue for signed void
default goto sizeof while
do if static volatile
Ключевые слова не могут быть переопределены. Тем не менее, они могут быть названы другим текстом, но тогда перед компиляцией они должны быть заменены посредством препроцессора на соответствующие ключевые слова.
Ключевые слова const и volatile зарезервированы для будущего использования.
Следующие идентификаторы могут быть ключевыми словами для некоторых приложений:
cdecl
far
fortran
huge
near
pascal
Комментарий- это последовательность символов, которая воспринимается компилятором как отдельный пробельный символ или, другими словами, игнорируется.
Комментарий имеет следующую форму представления:
/*<characters>*/,
где <characters> может быть любой комбинацией символов из множества представимых символов, включая символы новой строки, но исключая комбинацию */. Это означает, что комментарии могут занимать более одной строки, но не могут быть вложенными.
Комментарии допускаются везде, где разрешены пробельные символы. Компилятор игнорирует символы комментария, в частности, в комментариях допускается запись ключевых слов и зто не приведет к ошибке. Так как компилятор рассматривает комментарий как символ пробела, то комментарии не могут появляться внутри лексем.
Следующие примеры иллюстрируют некоторые комментарии:
/* Comments can separate and document
lines of a program. */
/* Comments can contain keywords such as for
and while */
/*******************************************
Comments can occupy several lines. *******************************************/
Так как комментарии не могут содержать вложенных комментариев, то следующий пример будет ошибочным:
/* You cannot/* nest */ comments */
Компилятор распознает первую комбинацию */ после слова nest как конец комментария. Затем, компилятор попытается обрабатывать оставшийся текст и выработает сообщение об ошибке. Чтобы обойти компиляцию комментариев больших размеров, нужно использовать директиву #if препроцессора.
Когда компилятор обрабатывает программу, он разбивает программу на группы символов, называемых лексемами. Лексема- это единица текста программы, которая имеет определенный смысл для компилятора и которая не может быть разбита в дальнейшем. Операции, константы, идентификаторы и ключевые слова, описанные в этом разделе,являются примерами лексем. Знаки пунктуации, такие как квадратные скобки ([]), фигурные скобки ({}), угловые скобки (<>), круглые скобки и запятые, также являются лексемами. Границы лексем определяются пробельными символами и другими лексемами, такими как операции и знаки пунктуации. Чтобы предупредить неправильную работу компилятора, запрещаются пробельные символы между символами идентификаторов, операциями, состоящими из нескольких символов и символами ключевых слов.