ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы.



 

Часть 1


                                       - 5 -
               
               
               
                                    1. ВВЕДЕНИЕ
               
               
               Настоящий документ разработан заведующим сектором Шолмовым
         Л.И. при помощи средств редактора текстов ЛЕКСИКОН.
               
                         
               Си  -  это  язык программирования общего назначения, хорошо
         известный своей эффективностью, экономичностью, и переносимостью.
         Указанные преимущества Си обеспечивают хорошее качество разработ-
         ки почти любого вида программного продукта.  Использование  Си  в
         качестве  инструментального  языка  позволяет  получать быстрые и
         компактные программы. Во многих случаях программы, написанные  на
         Си,  сравнимы по скорости с программами, написанными на языке ас-
         семблера. При этом они имеют лучшую наглядность и их более просто
         сопровождать.
               Си сочетает эффективность и мощность в  относительно  малом
         по размеру языке. Хотя Си не содержит встроенных компонент языка,
         выполняющих ввод-вывод, распределение памяти, манипуляций с экра-
         ном  или управление процессами, тем не менее, системное окружение
         Си располагает библиотекой об"ектных модулей, в которой  реализо-
         ваны подобные функции. Библиотека поддерживает многие из функций,
         которые требуются.
               Это  решение  позволяет изолировать языковые особенности от
         специфики процессора, на котором выполняется результирующая прог-
         рамма. Строгое определение языка делает его независимым от  любых
         деталей  операционной  системы или машины. В то же время програм-
         мисты могут добавить в библиотеку специфические  системные  прог-
         раммы, чтобы более эффективно использовать конкретной особенности
         машины.
                
               Перечислим некоторые существенные особенности языка Си:
          
               Си  обеспечивает полный набор операторов структурного прог-
         раммирования.
                         
               Си предлагает необычно большой набор операций. Многие  опе-
         рации  Си  соответствуют  машинным  командам, и поэтому допускают
         прямую трансляцию в машинный код. Разнообразие операций позволяет
         выбирать их различные наборы для минимизации результирующего  ко-
         да.
    
               Си  поддерживает  указатели на переменные и функции. Указа-
         тель на обект  программы  соответствует  машинному  адресу  этого
         об~екта.  Посредством  разумного  использования  указателей можно
         создавать эффективно-выполняемые  программы,  так  как  указатели
         позволяют ссылаться на об"екты тем же самым путем, как это делает
         машина. Си поддерживает арифметику указателей, и тем самым позво-
         ляет осуществлять непосредственный доступ и манипуляции с адреса-
         ми памяти.
    
               В своем составе Си содержит препроцессор, который обрабаты-
         вает текстовые файлы перед компиляцией. Среди его наиболее полез-
         ных приложений при написании программ на Си являются: определение
         программных констант, замена вызовов функций аналогичными, но бо-
         лее быстрыми макросами, условная компиляция. Препроцессор не  ог-
         раничен  процессированием только исходных текстовых файлов Си, он

                                      - 6 -
         
         
         может быть использован для любого текстового файла.
                
               Си- гибкий язык, позволяющий принимать в конкретных  ситуа-
         циях самые разные решения. Тем не менее, Си налагает незначитель-
         ные  ограничения в таких, например, действиях, как преобразование
         типов. Во многих случаях это является достоинством, однако  прог-
         раммисты  должны хорошо знать язык, чтобы понимать, как будут вы-
         полняться их программы.
               Данное руководство разработано фирмой Microsoft Inc.  Пред-
         полагается,  что  оно  предназначено  для программмистов, имеющих
         опыт работы с Си или другими языками программирования.
                
               Материал руководства организован следующим образом.
    
               В разделе 2 "Элементы MSC" описываются буквы, цифры и  сим-
         волы, которые могут быть использованы в программах на Си, а также
         комбинации  символов, которые имеют специальный смысл для Си-ком-
         пилятора.
               В разделе 3 "Сруктура программы"  обсуждаются  структура  и
         компоненты  программы,  а  также об"ясняется организация исходных
         файлов программ на Си.
               В разделе 4 "Об"явления" описывается то, каким образом спе-
         цифицировать атрибуты Си: переменные, функции, а также типы,  оп-
         ределенные пользователем. Си поддерживает некоторое число предоп-
         ределенных  типов  данных  и позволяет об"являть составные типы и
         указатели.
               В разделе 5 "Выражения и присваивания " описываются операн-
         ды и операции, из которых формирутся выражения и присваивания.  В
         разделе также обсуждаются вопросы преобразования типов и побочные
         эффекты, которые могут возникнуть при этом.
               В  разделе 6 "Операторы" описываются операторы, выполняющие
         программу на Си.
               В разделе 7 "Функции" обсуждаются особенности функций Си. В
         частности, в этом разделе об"ясняется, каким  образом определять,
         об"являть  и  вызывать функции, как описывать параметры функций и
         возвращаемые величины.
               В разделе 8 "Препроцессор директив и указаний  компилятору"
         описываются  команды,  узнаваемые препроцессором Си. Препроцессор
         Си- это текстовый процессор, автоматически вызываемый перед  ком-
         пиляцией.  В  этом  раэделе  также  рассмотрены "pragmas"- указа-
         ния(команды) компилятору,которые располагаются в файлах исходного
         текста.
               В разделе 9 "Приложения" дан краткий обзор отличий опреде-
         лений MSC от определений Си в книге Brian W. Kernighan and Denis
         M. Ritche "The C Programming Language", а также приведено краткое
         изложение синтаксиса MSC.
                                       
               
               1.1 Соглашения о нотации
    
               В руководстве приняты следующие соглашения о нотации.
           

                                      - 7 -
         
    
           Соглашение                          Значение
           ---------------------------------------------------------
         
           Жирный шрифт            Жирным шрифтом печатаются ключе-
                                   вые слова такие, как goto и char.
                                   
           Жирный шрифт            Жирным шрифтом в угловых скобках
           в угловых скоб-         отмечаются нетерминальные симво-
           ках                     лы в синтаксических конструкциях.
                                   Например,
           
                                           goto 
                                   
                                   Здесь  представлено жирным
                                   шрифтом в угловых скобках, чтобы
                                   обратить внимание на то, что оп-
                                   ределена общая форма представле-
                                   ния для оператора goto. В дейст-
                                   вительной программе пользователь
                                   подставит обычный идентификатор
                                   вместо нетерминального символа
                                   .
                
           
           Примеры                 Примеры программ на Си или их час-
                                   тей представляются в виде, подобном
                                   тому,  в  котором они отображаются
                                   на экране или принтере:
                
                                      int x,y;
                                      .
                                      .
                                      .
                                      swap(&x,&y);
                
           Многоточие             Многоточие может быть вертикальным
                                  или горизонтальным. В следующем при-
                                  мере вертикальные многоточия обозна-
                                  чают, что нуль  и  более  об"явлений
                                  следует   перед   одним   или  более
                                  операторами внутри фигурных скобок.
                
                                     {
                                      []
                                      .
                                      .
                                      .
                                      
                                      []
                                      .
                                      .
                                      .
                                     }
                                 Вертикальные     многоточия     также
                                 используются в примерах программ для
                                 обозначения части программы, которая
                                 пропущена.
                                 Горизонтальное  многоточие, следующее

                                      - 8 -
         
         
                                 после     некоторой    синтаксической
                                 конструкции, обозначает последователь-
                                 ность конструкций той же самой формы,
                                 что и предшествующая многоточию кон-
                                 струкция. Например,
                
                                 ={[,]...}
                           
                                 обозначает,   что   одно   или  более
                                 выражений, разделенных запятыми,может
                                 появиться между фигурными скобками.
                
           [] Квадратные         Квадратные скобки, ограничивающие син-
           скобки                таксическую конструкцию, обозначают ее
                                 возможное отсутствие. Например,
                
                                    return[];
                                 
                                 В    этой    конструкции не обязатель-
                                 но выражение .
           " " Ограничение       Ограничение двойными кавычками исполь-
           конструкций двой-     зуется для терминов, определяемых в
           ными    кавычками     данном    тексте.   Например,   термин
                                 "лексема"   заключается   в   двойные
                                 кавычки при его определении.
                
                
                
                
                
                
               2. Элементы MSC
         
               
               В этом разделе описываются элементы языка программирования
         MSC. Элементами языка являются имена, числа и символы, используе-
         мые в конструкциях программ на Си. В частности, в этой главе опи-
         сывается следующее:
                
                -множества символов;
                -константы;
                -идентификаторы;
                -ключевые слова;
                -комментарии;
                -лексемы.
         
               
               2.1. Множества символов
                
               В программах на Си  используется  два  множества  символов:
         множество символов Си и множество представимых символов. Множест-
         во  символов Си содержит буквы, цифры и знаки пунктуации, которые
         имеют определенное значение для компилятора Си. Программы  на  Си
         строятся  путем комбинирования в осмысленные конструкции символов
         из множества Си.

                                      - 9 -
         
         
               Множество  символов  Си  является  подмножеством  множества
         представимых символов. Множество представимых символов состоит из
         всех  букв,  цифр и символов, которые пользователь может предста-
         вить графически как отдельный символ. Мощность множества предста-
         вимых символов зависит от типа терминала, который используется.
               Программа на Си может содержать только символы из множества
         символов Си, за исключением строковых литералов, символьных конс-
         тант  и комментариев, где может быть использован любой представи-
         мый символ. Каждый символ из множества символов Си  имеет  вполне
         определенный  смысл для компилятора Си. Компилятор выдает сообще-
         ние об ошибке, когда он встречает неверно использованные  символы
         или символы, не принадлежащие множеству Си.
               В  следующих разделах описываются символы из множества сим-
         волов Си и об"ясняется как и где их использовать.
         
               
               2.1.1 Буквы и цифры
               
               Множество символов Си включает большие и малые буквы из ан-
         глийского алфавита и 10 десятичных арабских цифр:
                
                
                
                
                
                -большие английские буквы:
                
                A B C D E F G H I J K L M N O P Q R T U V W X Y Z
                
                -малые английские буквы:
                
                a b c d e f g h i j k l m n o p q r t u v w x y z
                
                -десятичные цифры:
                
                0 1 2 3 4 5 6 7 8 9
                
               Буквы и цифры используются при формировании констант, иден-
         тификаторов и ключевых слов. Все эти конструкции описаны ниже.
               Компилятор Си рассматривает одну и ту же  малую  и  большую
         буквы как отличные символы. Если в данной записи использованы ма-
         лые буквы, то замена малой буквы "a" на большую букву "A" сделает
         отличной данную запись от предшествующей.
         
               
               2.1.2. Пробельные символы
                
               Пробел,  табуляция,  перевод строки, возврат каретки, новая
         страница, вертикальная табуляция и новая строка- это сиволы,  на-
         зываемые  пробельными, поскольку они имеют то же самое назначение,
         как и пробелы между словами и строками на печатной странице.  Эти
         символы разделяют об"екты, определенные пользователем, такие, как
         константы и идентификаторы, от других об"ектов программы.
               Символ CONTROL-Z рассматривается как индикатор конца файла.
         Компилятор   игнорирует   любой   текст,  следующий  за  символом

                                      - 10 -
         
         
         CONTROL-Z.
               Компилятор Си игнорирует пробельные символы,  если  они  не
         используются как разделители или как компоненты константы-символа
         или  строковых  литералов. Это нужно иметь в виду, чтобы дополни-
         тельно использовать пробельные символы для повышения  наглядности
         программы (например,для просмотра редактором текстов).
               
               
               2.1.3. Знаки пунктуации и специальные символы
                
               Знаки  пунктуации и специальные символы из множества симво-
         лов Си используются для различных целей,  от  организации  текста
         программы  до определения заданий, которые будут выполнены компи-
         лятором или откомпилированной программой. В таблице 2.1  перечис-
         лены эти символы.
                
                
                
                
           -----------------------------------------------------------
           Символ        Наименование       Символ        Наименование
           -----------------------------------------------------------
                
             ,           Запятая               !          Восклицатель-
                                                          ный знак
             .           Точка                 |          Вертикальная
                                                          черта
             ;           Точка с за-           /          Наклонная чер-
                         пятой                            та вправо
             :           Двоеточие             \          Наклонная чер-
                                                          та влево
             ?           Знак вопроса          ~          Тильда
                
             '           Одиночная ка          _          Подчеркивание
                         вычка
             (           Левая круглая         #          Знак номера
                         скобка
             )           Правая круглая        %          Знак процента
                         скобка
             {           Левая фигурная        &          Амперсанд
                         скобка
             }           Правая фигурная       ^          Caret
                         скобка
             <           Левая угловая         -          Знак минус
                         скобка
             >           Правая угловая        =          Знак равно
                         скобка
             [           Левая  квадратная     +          Знак плюс
                         скобка
             ]           Правая квадратная
                         скобка
            -----------------------------------------------------------
                
                Табл. 2.1. Знаки пунктуации и специальные символы
                

                                      - 11 -
         
         
               Эти  символы имеют специальный смысл для компилятора Си. Их
         использование в языке Си описывается в дальнейшем содержании  ру-
         ководства.  Знаки  пунктуации из множества представимых символов,
         которые не представлены в данном списке, могут быть  использованы
         только в строковых литералах, константах-символах и комментариях.
         
               
               2.1.4. ESC- последовательности
                
               ESC-  последовательности- это специальные символьные комби-
         нации, которые представляют пробельные  символы  и  неграфические
         символы в строках и символьных константах.
               Их    типичное  использование  связано   со   спецификацией
         таких   действий,  как  возврат  каретки  и  табуляция ,  а также
         для  задания  литеральных  представлений  символов,   таких   как
         символ двойная кавычка. ESC-последовательность состоит из наклон-
         ной  черты  влево, за которой следует буква, знаки пунктуации ' " \
         или комбинация цифр. В таблице 2.2. приведен список ESC- последо-
         вательностей языка Си.
                
                -------------------------------------------------
                ESC- последовательность      Наименование
                -------------------------------------------------
                
                       \n                    Новая строка
                
                       \t                    Горизонтальная табу-
                                             ляция
                       \v                    Вертикальная табуля-
                                             ция
                       \b                    Пробел
                
                       \r                    Возврат каретки
                
                       \f                    Новая страница
                
                       \a                    Звонок(сигнал)
                
                       \'                    Одиночная кавычка
                
                       \"                    Двойная кавычка
                
                       \\                    Наклонная черта влево
                
                       \ddd                  ASCII символ в восьми-
                                             ричном представлении
                       \xdd                  ASCII символ в шестнад-
                                             цатиричном представлении
                ------------------------------------------------------
                
                Табл. 2.2. ESC- последовательности
                
               Если наклонная черта влево предшествует символу,  не  вклю-
         ченному  в  этот список, то наклонная черта влево игнорируется, а
         символ представляется как  литеральный. Например, изображение  \c

                                      - 12 -
         
         
         представляет символ "c" в литеральной строке или константе-симво-
         ле.
               Последовательности  \ddd и \xdd позволяют задать любой сим-
         вол в ASCII (Американский стандартный код  информационного интер-
         фейса) как последовательность трех восьмеричных цифр или двух ше-
         стнадцатеричных цифр. Например, символ пробела может  быть  задан
         как \010 или \x08. Код ASCII "нуль" может быть задан  как \0  или
         \x0 . В  восьмеричной  ESC- последовательности могут быть исполь-
         зованы от одной до трех восьмеричных цифр.
               
               Например, символ пробела может быть задан  как \10 .  Точно
         так же в шестнадцатеричной ESC- последовательности могут быть ис-
         пользованы от одной до двух шестнадцатеричных цифр. Так, шестнад-
         цатеричная последовательность для символа  пробела может быть за-
         дана  как \x08 или \x8 .
               
               Замечание:
                
               Когда используется восьмеричная или шестнадцатеричная  ESC-
         последовательность  в  строках,  то  нужно полностью задавать все
         цифры ESC- последовательности (три цифры для восьмеричной  и  две
         цифры для шестнадцатеричной ESC- последовательностей). Иначе, ес-
         ли  символ непосредственно следующий за ESC- последовательностью,
         случайно окажется восьмеричной или шестнадцатеричной  цифрой,  то
         он  проинтерпретируется  как  часть последовательности. Например,
         строка  \x7Bell  при  выводе на печать будет выглядеть как {ell ,
         поскольку  \x7B  проинтерпретируется как символ  левой  фигурной
         скобки({) . Строка  \x07Bell будет правильным представлением сим-
         вола "звонок" с последующим словом Bell.
           
               ESC-  последовательности  позволяют  посылать неграфические
         управляющие символы к внешним устройствам. Например, ESC-  после-
         довательность\033 часто используется как первый символ команд уп-
         равления терминалом и  принтером.  Неграфические  символы  всегда
         должны представляться ESC-последовательностями, поскольку, непос-
         редственное использование в программах на Си неграфических симво-
         лов будет иметь непредсказуемый результат.
               Наклонная черта влево (\) помимо определения ESC-последова-
         тельностей  используется  также,  как символ продолжения строки в
         препроцессорных определениях.
               Если символ "новая строка" следует за наклонной чертой вле-
         во, то новая строка игнорируется и следующая строка  рассматрива-
         ется, как часть предыдущей строки.
                      
               
               2.1.5. Операции
                
               Операции- это специальные комбинации символов, специфициру-
         ющие  действия по пробразованию различных величин. Компилятор ин-
         терпретирует каждую из этих комбинаций как самостоятельную едини-
         цу, называемую лексемой (token).
               В Табл. 2.3 представлен список  операций.  Операции  должны
         использоваться точно так, как они представлены в таблице: без про-
         бельных  символов между символами в тех операциях, которые предс-
         тавлены несколькими символами.

                                      - 13 -
         
         
               Операция sizeof не включена в эту таблицу. Она скорее пред-
         ставляет собой ключевое слово, чем символ.
                
                -------------------------------------------------
                Операция                     Наименование
                -------------------------------------------------
                
                   !                         Логическое НЕ
                
                   ~                         Побитовое дополнение
                
                   +                         Сложение
                
                   -                         Вычитание, арифмети-
                                             ческое отрицание
                   *                         Умножение
                
                   /                         Деление
                
                   %                         Остаток
                
                   <<                        Сдвиг влево
                
                   >>                        Сдвиг вправо
                
                   <                         Меньше
                
                   <=                        Меньше или равно
                
                   >                         Больше
                
                   >=                        Больше или равно
                
                   ==                        Равно
                
                   !=                        Не равно
                
                   &                         Побитовое И, адрес от
                
                   |                         Побитовое  включающее ИЛИ
                
                   ^                         Побитовое исключающее ИЛИ
                
                   &&                        Логическое И
                
                   ||                        Логическое ИЛИ
                
                   '                         Последовательное выполне-
                                             ние (запятая)
                   ?:                        Операция условного вы-
                                             ражения
                   ++                        Инкремент
                
                   --                        Декремент
                

                                      - 14 -
         
         
                   =                         Простое присваивание
                
                   +=                        Сложение с присваиванием
                
                   -=                        Вычитание с присваиванием
                  
                   *=                        Умножение с присваиванием
                   
                   /=                        Деление с присваиванием
                   
                   %=                        Остаток с присваиванием
                   
                   >>=                       Сдвиг вправо с присваива-
                                             иванием
                   <<=                       Сдвиг влево с присваива-
                                             нием
                   &=                        Побитовое И с присваива-
                                             нием
                   |=                        Побитовое включающее ИЛИ
                                             с присваиванием
                   ^=                        Побитовое исключающее ИЛИ
                                             с присваиванием
                
                -------------------------------------------------------
           
                          Табл. 2.3. Операции
                
               Замечание:
                
               Операция  условного выражения ?: -это тернарная, а не двух-
         символьная  операция.  Формат  условного   выражения   следующий:
         ?:
         
               
               2.2. Константы
                
               Константа- это число, символ или строка символов. Константы
         используются  в  программе  как неизменяемые величины. В языке Си
         различают четыре типа констант: целые константы, константы с пла-
         вающей точкой, константы-символы и строчные литералы.
               
               
               2.2.1 Целые константы
                
               Целая константа- это десятичное, восьмеричное или  шестнад-
         цатеричное число, которое представляет целую величину. Десятичная
         константа имеет следующий формат представления:
                
               ,
                
               где    - это одна или более десятичных цифр от 0 до
         9.
               Восьмеричная константа имеет следующий  формат  представле-
         ния:
                

                                      - 15 -
         
         
               0,
                
               где    - это одна или более восьмеричных цифр от 0
         до 7. Запись ведущего нуля необходима.
               Шестнадцатеричная константа имеет один из следующих  форма-
         тов представления:
                
               0x
               0X,
                
               где  одна или более шестнадцатеричных цифр.
               Шестнадцатеричная  цифра  может  быть  цифрой от 0 до 9 или
         буквой (большой или малой) от A до F. В  представлении  константы
         допускается  "смесь" больших и малых букв. Запись ведущего нуля и
         следующего за ним символа x или X необходима.
               Пробельные символы не допускаются между цифрами целой конс-
         танты. В Табл. 2.4 иллюстрируются примеры целых констант.
                
           -----------------------------------------------------------
           Десятичные           Восьмеричные         Шестнадцатеричные
           константы            константы            константы
           -----------------------------------------------------------
           10                   012                  0xa или 0xA
           132                  0204                 0x84
           32179                076663               0x7dB3 или 0x7DB3
           -----------------------------------------------------------
                
                      Табл. 2.4 Примеры констант
                
               Целые константы всегда специфицируют положительные  величи-
         ны.  Если требуется отрицательные величины, то необходимо сформи-
         ровать константное выражение из знака минус и  следующей  за  ним
         константы.  Знак  минус рассматривается как арифметическая опера-
         ция.
               Каждая целая константа специфицируется типом,  определяющим
         ее представление в памяти и область значений. Десятичные констан-
         ты могут быть типа int или long.
               Восьмеричные и шестнадцатеричные константы в зависимости от
         размера  могут  быть  типа  int,  unsigned int, long или unsigned
         long. Если константа может быть представлена как int, она  специ-
         фицируется  типом  int. Если ее величина больше, чем максимальная
         положительная величина, которая  может  быть  представлена  типом
         int,  но  меньше  величины, которая представляется в том же самом
         числе бит как и int, она задается типом  unsigned  int.  Наконец,
         константа,  величина  которой  больше чем  максимальная величина,
         представляемая  типом  unsigned  int,  задется  типом  long   или
         unsigned long, если это необходимо. В Табл. 2.5 показаны диапазо-
         ны  величин восьмеричных и шестнадцатеричных констант, представи-
         мых соответствующими типами на машине, где тип int имеет длину 16
         бит.
           
           -----------------------------------------------------------
           Шестнадцатеричные           Восьмеричные           Тип
           диапазоны                   диапазоны
           -----------------------------------------------------------

                                      - 16 -
         
         
           0x0-0x7FFF              0-077777                   int
           0x8000-0xFFFF           0100000-0177777            unsigned
                                                              int
           0x10000-0x7FFFFFFF      0200000-017777777777       long
           0x80000000-0xFFFFFFFF   020000000000-030000000000  unsigned
                                                              long
           -----------------------------------------------------------
                
                Табл.    2.5    Диапазоны   величин   восьмеричных   и
                                шестнадцатеричных констант
                
               Важность рассмотренных выше правил состоит в том, что вось-
         меричные и шестнадцатеричные  константы  не  содержат  "знаковых"
         расширений, когда они преобразуются к более длинным типам (преоб-
         разование типов смотри в разделе 5 "Выражения и присваивания").
               Программист  может определить для любой целой константы тип
         long, приписав букву "l" или "L" в конец константы. В  Табл.  2.6
         показаны примеры целых констант.
           
           ------------------------------------------------------------
           Десятичные          Восьмеричные           Шестнадцатеричные
           константы           константы              константы
           ------------------------------------------------------------
           
           10L                 012L                   0xaL или 0xAL
           79l                 0115l                  0x4fl или 0x4Fl
           ------------------------------------------------------------
                
                Табл. 2.6 Примеры целых констант типа long
                
                
                
               2.2.2. Константы с плавающей точкой
                
               Константа с плавающей точкой- это действительное десятичное
         положительное  число. Величина действительного числа включает це-
         лую, дробную части и зкспоненту.  Константы  с  плавающей  точкой
         имеют следующий формат представления:
                
               [][.][E[-]],
                
               где   - одна или более десятичных цифр (от 0 до 9),
         а E или e -символ экспоненты. Целая или дробная  части  константы
         могут  быть опушены, но не обе сразу. Десятичная точка может быть
         опущена только тогда, когда задана экспонента.
               Экспонента состоит из символа экспоненты, за которым следу-
         ет целочисленная величина экспоненты, возможно отрицательная.
               Пробельные символы не могут  разделять  цифры  или  символы
         константы.
               Константы  с  плавающей точкой всегда специфицируют положи-
         тельные величины. Если требуются отрицательные величины, то необ-
         ходимо сформировать константное выражение из знака минус и следу-
         ющей за ним константы. Знак минус рассматривается  как  арифмети-
         ческая операция.
               Примеры  констант  с плавающей точкой и константных выраже-

                                      - 17 -
         
         
         ний:
                
               15.75
               1.575E1
               1575e-2
               -0.0025
               -2.5e-3
               25e-4
               Целая часть константы с плавающей точкой может быть  опуще-
         на, например:
                
               .75
               .0075e2
               -.125
               -.175E-2
                
               Все константы с плавающей точкой имеют тип double.
                
               2.2.3. Константа-символ
                
               Константа-символ-  это  буква,  цифра,  знак пунктуации или
         ESC- символ, заключенные в одиночные кавычки.  Величина  констан-
         ты-символа равна значению представляющего ее кода символа.
               Константа-символ имеет следующую форму представления:
                 
               '',
               где   может быть любым символом иэ множества предста-
         вимых символов, включая любой ESC- символ, исключая одиночную ка-
         вычку ('), наклонную черту влево (\) и символ новой строки.
               Чтобы использовать одиночную кавычку  или  наклонную  черту
         влево  в  качестве  константы-символа,  необходимо вставить перед
         этими знаками наклонную черту влево. Чтобы представить символ но-
         вой строки, необходимо использовать запись '\n'.
                
                ----------------------------------------------
                Константа                   Название величины
                ----------------------------------------------
                'a'                          Малая буква а
                
                '?'                          Знак вопроса
                
                '\b'                         Знак пробела
                
                '0x1B'                       ASCII ESC- символ
                
                '\''                         Одиночная кавычка
                
                '\\'                         Наклонная черта вле-
                                             во
                -------------------------------------------------
                
                Табл. 2.7 Примеры констант-символов.
                
               Константы-символы имеют тип int.
                                                                 

                                      - 18 -
         
         
               
               2.2.4. Строковые литералы
                
               Строковый литерал- это последовательность букв, цифр и сим-
         волов, заключенная в двойные кавычки. Строковый литерал  рассмат-
         ривается как массив символов, каждый элемент которого представля-
         ет  отдельный  символ.  Строковый  литерал  имеет следующую форму
         представления:
                
               "" ,
               где  - это нуль или более символов из множества
         представимых символов, исключая двойную  кавычку  ("),  наклонную
         черту влево (\)  и символ новой строки. Чтобы использовать символ
         новой строки в строковом литерале, необходимо напечатать  наклон-
         ную черту влево, а затем символ новой строки.
               Наклонная  черта влево вместе с символом новой строки будут
         проигнорированы компилятором , что позволяет формировать  строко-
         вые  литералы,  располагаемые более чем в одной строке. Например,
         строковый литерал:
                
               "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 (отметка конца  строки)  тоже
         считается элементом массива.
               
               
               2.3. Идентификаторы
                
               Идентификаторы-  это имена переменных, функций и меток, ис-
         пользуемых в программе. Идентификатор создается об"явлением соот-

                                      - 19 -
         
         
         ветствующей ему переменной или функции.После этого его можно  ис-
         пользовать в последующих операторах программы. Идентификатор- это
         последовательность  из  одной  или  более  букв, цифр или подчер-
         ков(_), которая начинается с буквы или подчерка. Допускается  лю-
         бое число символов в идентификаторе, однако только первые 31 сим-
         вол распознаются компилятором. (Программы, использующие результат
         работы компилятора, такие как, линкер, могут распознавать меньшее
         число символов).
               При использовании подчерков в идентификаторе нужно быть ос-
         торожным, поскольку идентификаторы, начинающиеся с подчерка могут
         совпадать  (войти в конфликт) с именами "скрытых" системных прог-
         рамм.
               Примеры идентификаторов:
               temp1
               toofpage
               skip12
               Компилятор Си рассматривает буквы верхнего и нижнего регис-
         тров как различные символы. Поэтому можно создать отдельные неза-
         висимые идентификаторы, которые совпадают орфографически, но раз-
         личаются большими и малыми буквами. Например, каждый из следующих
         идентификаторов является уникальным:
               add
               ADD
               Add
               aDD
                
               Компилятор Си не допускает идентификаторов,  которые  имеют
         ту же самую орфографию, что и ключевые слова. Ключевые слова опи-
         саны в разделе 2.4.
                
               Замечание:
                
               По сравнению с компилятором, сборщик может в большей степе-
         ни  ограничивать количество и тип символов для глобальных иденти-
         фикаторов, и в отличие от компилятора не  делать  различия  между
         большими и малыми буквами. (Подробнее смотри руководство по паке-
         ту MSC).
         
               
               2.4. Ключевые слова
                
               Ключевые  слова- это предопределенные идентификаторы, кото-
         рые имеют специальное значение для компилятора Си. Их  можно  ис-
         пользовать только так как они определены. Имена об"ектов програм-
         мы не могут совпадать с названиями ключевых слов.
                
               Список ключевых слов:
                
               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

                                      - 20 -
         
         
               do           if             static      volatile
                
               Ключевые слова  не могут быть переопределены. Тем не менее,
         они могут быть названы другим текстом, но тогда перед компиляцией
         они должны быть заменены посредством препроцессора на  соответст-
         вующие ключевые слова.
               Ключевые  слова const и volatile зарезервированы для  буду-
         щего использования.
               Следующие идентификаторы могут быть ключевыми  словами  для
         некоторых приложений:
                
               cdecl
               far
               fortran
               huge
               near
               pascal
          
               
               2.5. Комментарии
                
               Комментарий- это последовательность символов, которая восп-
         ринимается компилятором как отдельный пробельный символ или, дру-
         гими словами, игнорируется.
               Комментарий имеет следующую форму представления:
                
               /**/,
                
               где    может быть любой комбинацией символов из
         множества представимых символов, включая символы новой строки, но
         исключая комбинацию */. Это означает, что комментарии могут зани-
         мать более одной строки, но не могут быть вложенными.
               Комментарии допускаются  везде,  где  разрешены  пробельные
         символы.  Компилятор игнорирует символы комментария, в частности,
         в комментариях допускается запись ключевых слов и зто не приведет
         к ошибке. Так как компилятор рассматривает комментарий как символ
         пробела, то комментарии не могут появляться внутри лексем.
               Следующие примеры иллюстрируют некоторые комментарии:
                
               /* 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
         как  конец комментария. Затем, компилятор попытается обрабатывать
         оставшийся текст и выработает сообщение об ошибке.  Чтобы  обойти

                                      - 21 -
         
         
         компиляцию  комментариев больших размеров, нужно использовать ди-
         рективу #if препроцессора.
         
               
               2.6. Лексемы
                
               Когда компилятор обрабатывает программу, он разбивает прог-
         рамму на группы символов, называемых лексемами. Лексема- это еди-
         ница текста программы, которая имеет определенный смысл для  ком-
         пилятора  и которая не может быть разбита в дальнейшем. Операции,
         константы, идентификаторы и ключевые слова, описанные в этом раз-
         деле,являются примерами лексем. Знаки пунктуации, такие как квад-
         ратные скобки ([]), фигурные скобки ({}),  угловые  скобки  (<>),
         круглые  скобки и запятые, также являются лексемами. Границы лек-
         сем определяются пробельными символами и другими лексемами, таки-
         ми как операции и знаки пунктуации. Чтобы предупредить неправиль-
         ную работу компилятора, запрещаются пробельные символы между сим-
         волами идентификаторов, операциями, состоящими из нескольких сим-
         волов и символами ключевых слов.
               Когда  компилятор выделяет отдельную лексему, он последова-
         тельно об"единяет столько символов, сколько возможно, прежде  чем
         перейти  к обработке следующей лексемы. Поэтому  лексемы, не раз-
         деленные пробельными символами,  могут  быть  проинтерпретированы
         неверно.
               Например, рассмотрим следующее выражение:
                
                i+++j
                
               В  этом  примере  компилятор вначале создает из трех знаков
         плюс самую длинную из возможных операций (++), а затем обработает
         оставшийся знак +, как операцию сложения (+). Выражение проинтер-
         претируется как (i++)+(j), а не как (i)+(++j).  В  таких  случаях
         необходимо  использовать  пробельные  символы или круглые скобки,
         чтобы однозначно определить ситуацию.


?????? ???????????