Главная страница
Навигация по странице:

  • А 2. Соглашения о лексике

  • 242 Приложение А. Справочное руководство

  • А 2.6. Строковые литералы

  • 246 Приложение А. Справочное

  • Нотация синтаксиса

  • А 4. Что обозначают идентификаторы

  • Б. Керриган, Д. Ритчи Язык программирования C. Б. Керниган, Д. зык программирования и . Издание 3е, исправленное Перевод с английского под редакцией Вс. С. Штаркмана СанктПетербург 2003


    Скачать 31.48 Mb.
    НазваниеБ. Керниган, Д. зык программирования и . Издание 3е, исправленное Перевод с английского под редакцией Вс. С. Штаркмана СанктПетербург 2003
    АнкорБ. Керриган, Д. Ритчи Язык программирования C.pdf
    Дата06.04.2017
    Размер31.48 Mb.
    Формат файлаpdf
    Имя файлаБ. Керриган, Д. Ритчи Язык программирования C.pdf
    ТипКнига
    #4546
    страница18 из 28
    1   ...   14   15   16   17   18   19   20   21   ...   28
    Справочное руководство
    А Введение
    Данное руководство описывает язык программирования Си, опре- деленный 31 октября 1989 г. в соответствии с проектом, утвержденным в ANSI в качестве Американского национального стандарта для инфор- мационных
    Язык программирования Си,
    ("American
    National Standard for Information Systems - Programming Language C,
    Это описание - лишь один из вариантов предлагаемого стандарта, а не сам стандарт, однако мы специально заботились о том,
    чтобы сделать его надежным руководством по языку.
    Настоящий документ в основном следует общей схеме описания, при- нятой в стандарте (публикация которого в свою очередь основывалась на первом издании этой книги), однако в организационном плане есть раз- личия. Если не считать отклонений в названиях нескольких продуктов и отсутствия формальных определений лексем и препроцессора, грамма- тика языка здесь и грамматика в стандарте эквивалентны.
    Далее примечания (как и это) набираются с отступом от левого края стра- ницы. В основном эти примечания касаются отличий стандарта от версии языка, описанной в первом издании этой книги, и от последующих ново- введений в различных компиляторах.
    А 2. Соглашения о лексике
    Программа состоит из одной или нескольких единиц трансляции, хра- нящихся в виде файлов. Каждая такая единица проходит несколько фаз трансляции, описанных в
    Начальные фазы лексичес- кие преобразования нижнего уровня, выполняют директивы, заданные

    242 Приложение А. Справочное руководство
    в программе строками, начинающимися со знака обрабатывают макро- определения и производят макрорасширения. По завершении работы пре- процессора программа представляется в виде последовательности лексем.
    А
    Лексемы (tokens)
    Существуют шесть классов лексем (или токенов):
    ключевые слова, константы, строковые литералы, операторы и прочие разделители. Пробелы, горизонтальные и вертикальные табуляции, но- вые строки, переводы страницы и комментарии (имеющие общее назва- ние символы-разделители) рассматриваются компилятором только как разделители лексем и в остальном на результат трансляции влияния не оказывают. Любой из символов-разделителей годится, чтобы отделить друг от друга соседние идентификаторы, ключевые слова и константы.
    Если входной поток уже до некоторого символа разбит на то следующей лексемой будет самая длинная строка, которая может быть лексемой.
    А 2.2. Комментарий
    Символы /* открывают комментарий, а символы */ закрывают его.
    Комментарии нельзя вкладывать в друга, их нельзя помещать внутрь строк или текстовых литералов.
    Идентификаторы
    Идентификатор — это последовательность букв и цифр. Первым сим- волом должна быть буква; знак подчеркивания _ считается буквой. Бук- вы нижнего и верхнего регистров различаются. Идентификаторы могут иметь любую длину; для внутренних идентификаторов значимыми явля- ются первые 31 символ; в некоторых реализациях принято большее чис- ло значимых символов. К внутренним идентификаторам относятся име- на макросов и все другие имена, не имеющие внешних связей
    На идентификаторы с внешними связями могут накладываться большие ограничения: иногда воспринимаются не более шести первых символов и могут не различаться буквы верхнего и нижнего регистров.
    А 2.4. Ключевые слова
    Следующие идентификаторы зарезервированы в качестве ключевых слов и в другом смысле использоваться не могут:
    auto char default else break const do case continue double extern

    А 2. Соглашения о лексике 243
    float for goto if int long register short signed sizeof static struct switch union unsigned void volatile while
    В некоторых реализациях резервируются также слова ran и asm.
    Ключевые слова const, signed и volatile впервые появились в стандарте
    ANSI;
    и void - новые по отношению к первому изданию книги, но уже использовались; ранее зарезервированное нигде не использовалось и поэтому более не резервируется.
    А 2.5. Константы
    Существует несколько видов констант. Каждая имеет свой тип данных;
    базовые типы рассматриваются в
    константа:
    -константа
    константа-перечисление
    А
    Целые константы
    Целая константа, состоящая из последовательности цифр, восприни- мается как восьмеричная, если она начинается с 0 (цифры нуль), и как десятичная в противном случае. Восьмеричная константа не содержит цифр 8 и 9. Последовательность цифр, перед которой стоят Ох или ОХ, рас- сматривается как шестнадцатеричное целое. В
    циф- ры включены буквы от а (или А) до f (или F) со значениями от до 15.
    Целая константа может быть записана с буквой-суффиксом и (или U)
    для спецификации ее как беззнаковой константы. Она также может быть с буквой-суффиксом 1 (или L) для указания, что она имеет тип long.
    Тип целой константы зависит от ее вида, значения и суффикса (о ти- пах см. А4). Если константа - десятичная и не имеет суффикса, то она принимает первый из следующих типов, который годится для представ- ления ее значения: int, long int, unsigned long int. Восьмеричная или ше- стнадцатеричная константа без суффикса принимает первый возможный из типов: int, unsigned int, long int, unsigned long int. Если константа име- ет суффикс и или U, то она принимает первый возможный из типов: unsigned i n t , unsigned int. Если константа имеет суффикс 1 или она при- нимает первый возможный из типов: long int, unsigned long int. Если кон- станта имеет суффикс или UL, то она принимает тип unsigned long int.

    244 Приложение А.
    руководство
    Типы целых констант получили существенное развитие в сравнении с пер- вой редакцией языка, в которой большие целые имели просто тип
    Суф- фиксы U и и введены впервые.
    Символьные константы
    Символьная константа - это последовательность из одной или несколь- ких символов, заключенная в одиночные кавычки (например '
    Если внутри одиночных кавычек расположен один символ, значением констан- ты является числовое значение этого символа в кодировке, принятой на данной машине. Значение константы с несколькими символами зави- сит от реализации.
    Символьная константа не может содержать в себе одиночную или символ новой строки; чтобы изобразить их и некоторые другие сим- волы, могут быть использованы эскейп-последовательности:
    новая строка linefeed) NL (LF) \n горизонтальная табуляция tab) HT \t вертикальная табуляция (vertical tab) VT \v возврат на шаг (backspace) BS \b возврат каретки (carriage return) CR \r перевод страницы (formfeed) FF \f сигнал звонок (audible alert, bell) BEL \a обратная наклонная черта
    (backslash) \ \\
    знак вопроса (question mark) ? \?
    одиночная кавычка (single quote)
    двойная кавычка (double quote)
    восьмеричный код (octal number)
    \ooo
    код
    (hex number)
    Эскейп-последовательность \ооо состоит из обратной наклонной черты,
    за которой следуют одна, две или три восьмеричные цифры, специфици- рующие значение желаемого символа. Наиболее частым примером такой конструкции является
    (за которой не следует цифра); она специфици- рует
    Эскейп-последовательность состоит из обратной наклонной черты с буквой х, за которыми следуют цифры, специфицирующие значение желаемого символа. На количество цифр нет ограничений, но результат будет не определен, если значение полученного символа превысит значение самого "большого" из допусти- мых символов. Если в данной реализации тип трактуется как число

    А 2. Соглашения о лексике 245
    со знаком, то значение и в восьмеричной, и в шестнадцатеричнои эскейп- последовательности получается с помощью "распространения знака", как если бы выполнялась операция приведения типу
    Если за \ не следу- ет ни один из перечисленных выше символов, результат не определен.
    В некоторых реализациях имеется расширенный набор символов, ко- торый не может быть охвачен типом char. Константа для такого набора пишется с буквой L впереди (например
    ) и называется расширенной символьной константой. Такая константа имеет тип r_t (целочислен- ный тип, определенный в стандартном заголовочном файле h>).
    Как и в случае обычных символьных констант, здесь также возможны восьмеричные и эскейп-последовательности; если специфицированное значение превысит тип результат будет не определен.
    Некоторые из приведенных эскейп-последовательностей новые (шестнад- цатеричные в частности). Новым является и расширенный тип для симво- лов. Наборам символов, обычно используемым в Америке и Западной Ев- ропе, подходит тип char, а тип был добавлен главным образом для азиатских языков.
    А 2.5.3. Константы с плавающей точкой
    Константа с плавающей точкой состоит из целой части, десятичной точки, дробной части, е или Е и целого (возможно, со знаком), представ- ляющего порядок, и, возможно, суффикса типа, задаваемого одной из букв:
    F, 1 или L. И целая, и дробная часть представляют собой последователь- ность цифр. Либо целая часть, либо дробная часть (но не обе вместе) мо- гут отсутствовать; также могут отсутствовать десятичная точка или Е с по- рядком (но не обе одновременно). Тип определяется суффиксом; F или f определяют тип float,
    1
    long double; при отсутствии суффик- са подразумевается тип
    Суффиксы для констант с плавающей точкой являются нововведением.
    Константы-перечисления
    Идентификаторы, объявленные как элементы перечисления (А8.4),
    являются константами типа int.
    А 2.6. Строковые литералы
    Строковый литерал, который также называют строковой константой, - это последовательность символов, заключенная в двойные кавычки (На- пример,
    Строка имеет тип "массив символов" и память класса static
    (А4), которая инициализируется заданными символами. Представляют- ся ли одинаковые строковые литералы одной копией или несколькими,

    246 Приложение А. Справочное
    зависит от реализации. Поведение программы, пытающейся изменить строковый литерал, не определено.
    Написанные рядом строковые литералы объединяются (конкатениру- ются) в одну строку. После любой конкатенации к строке добавляется
    (\0), что позволяет программе, просматривающей строку, най- ти ее конец. Строковые литералы не могут содержать в себе символ но- вой строки или двойную кавычку; в них нужно использовать те же эс- что и в символьных константах.
    Как и в случае с символьными константами, строковый литерал с сим- волами из расширенного набора должен начинаться с буквы L (например
    Строковый литерал из набора имеет тип "массив из
    Конкатенация друг с другом обычных и "расширенных" стро- ковых литералов не определена.
    То, что строковые литералы не обязательно представляются разными ко- пиями, запрет на их модификацию, а также конкатенация соседних строко- вых литералов - нововведения ANSI-стандарта. "Расширенные" строковые литералы также объявлены впервые.
    Нотация синтаксиса
    В нотации синтаксиса, используемой в этом руководстве, синтаксиче- ские понятия набираются курсивом, а слова и символы, воспринимаемые буквально, обычным шрифтом. Альтернативные конструкции обычно перечисляются в столбик (каждая альтернатива на отдельной строке);
    в редких случаях длинные списки небольших по размеру альтернатив рас- полагаются в одной строке, помеченной словами "один из". Необязатель- ное слово-термин или не термин снабжается индексом
    Так, запись
    {
    }
    обозначает выражение, заключенное в фигурные скобки, которое в об- щем случае может отсутствовать. Полный перечень синтаксических кон- струкций приведен в А13.
    В отличие от грамматики, данной в первом издании этой книги, приведен- ная здесь грамматика старшинство и порядок выполнения операций в вы- ражениях описывает явно.
    А 4. Что обозначают идентификаторы
    Идентификаторы, или имена, ссылаются на разные объекты (в оригина- ле - things. - Примеч. ред.): функции; теги структур, объединений и пере-

    А 4. Что обозначают идентификаторы 247
    числений; элементы структур или объединений; typedef-имена; метки и объекты. Объектом (называемым иногда переменной) является часть па- мяти, интерпретация которой зависит от двух главных характеристик: класса
    памяти и ее типа. Класс памяти сообщает о времени жизни памяти, связан- ной с идентифицируемым объектом; тип определяет, какого рода значения находятся в объекте. С любым именем ассоциируются своя область види- мости (т. е. тот участок программы, где это имя известно) и атрибут связи,
    определяющий, обозначает это имя в другом файле же самый объект или функцию. Область видимости и атрибут связи обсуждаются в
    А
    Класс памяти
    Существуют два класса памяти: автоматический и статический. Не- сколько ключевых слов в совокупности с контекстом объявлений объек- тов специфицируют класс памяти для этих объектов.
    Автоматические объекты локальны в блоке (А9.3), при выходе из него они "исчезают". Объявление, заданное внутри блока, если в нем отсут- ствует спецификация класса памяти или указан спецификатор auto, со- здает автоматический объект. Объект, помеченный в объявлении словом register, является автоматическим и размещается по возможности в ре- гистре машины.
    Статические объекты могут быть локальными в блоке или располагать- ся вне блоков, но в обоих случаях их значения сохраняются после выхода из блока (или функции) до повторного в него входа. Внутри блока (в том числе и в блоке, образующем тело функции) статические объекты в объяв- лениях помечаются словом static. Объекты, объявляемые вне всех бло- ков на одном уровне с определениями функций, всегда статические. С по- мощью ключевого слова static их можно сделать локальными в пределах транслируемой единицы (в этом случае они получают атрибут внутрен-
    ней связи), и они становятся глобальными для всей программы, если опу- стить явное указание класса памяти или использовать ключевое слово
    (в этом случае они получают атрибут внешней связи).
    А 4.2. Базовые типы
    Существует несколько базовых типов. Стандартный заголовочный файл h>, описанный в приложении В, определяет самое большое и самое малое значения для каждого типа в данной конкретной реализа- ции. В приложении В приведены минимально возможные величины.
    Размер объектов, объявляемых как символы, позволяет хранить лю- бой символ из набора символов, принятого в машине. Если объект типа char действительно хранит символ из данного набора, то его значением является код этого символа, т. е. некоторое неотрицательное целое. Пере- менные типа могут хранить и другие но тогда диапазон их

    248 Приложение А. Справочное руководство значений и особенно вопрос о том, знаковые эти значения или беззнако- вые, зависит от реализации.
    Беззнаковые символы, объявленные с помощью слов u n s i g n e d c h a r ,
    имеют ту же разрядность, что и обычные символы, но представляют не- отрицательные значения; с помощью слов signed char можно явно объ- явить символы со знаком, которые занимают столько же места,
    и обыч- ные символы.
    Тип unsigned char не упоминался в первой редакции языка, но всеми ис- пользовался. Тип signed char - новый.
    Помимо char среди целочисленных типов могут быть целые трех раз- меров: short int, int и long int. Обычные объекты типа int имеют есте- ственный размер, принятый в архитектуре данной машины, другие раз- меры предназначены для специальных нужд. Более длинные целые по крайней мере покрывают все значения более коротких целых, однако в некоторых реализациях обычные целые могут быть эквивалентны ко- ротким (short) или длинным (long) целым. Все типы int представляют значения со знаком, если не оговорено противное.
    Для беззнаковых целых в объявлениях используется ключевое слово unsigned. Такие целые подчиняются арифметике по
    2", где п -
    число битов в представлении числа, и, следовательно, в арифметике с без- знаковыми целыми никогда не бывает переполнения. Множество неотри- цательных значений, которые могут в объектах со знаком, яв- ляется подмножеством значений, которые могут храниться в соответству- ющих объектах без знака; знаковое и беззнаковое представления каждого такого значения совпадают.
    Любые два из типов с плавающей точкой: с одинарной точностью с двойной точностью (double) и с повышенной точностью (long double) могут быть синонимами, но каждый следующий тип этого списка должен по крайней мере обеспечивать точность предыдущего.
    long double - новый тип. В первой редакции языка синонимом для double был long теперь последний изъят из обращения.
    Перечисления - единственные в своем роде типы, которым дается пол- ный перечень значений; с каждым перечислением связывается множество именованных констант
    Перечисления ведут себя наподобие це- лых, но компилятор обычно выдает предупреждающее сообщение, если объекту некоторого перечислимого типа присваивается нечто, отличное от его константы, или выражение не из этого перечисления.
    Поскольку объекты перечислений можно рассматривать как числа,
    перечисление относят к арифметическому типу. Типы и int всех раз- меров, каждый из которых может быть со знаком или без знака, а также

    А 5. Объекты и Lvalues 249
    перечисления называют целочисленными (integral) типами. Типы float,
    double и long double называются типами с плавающей точкой.
    Тип void специфицирует пустое множество значений. Он использует- ся как "тип возвращаемого функцией значения" в том случае, когда она не генерирует никакого результирующего значения.
    А 4.3. Производные типы
    Помимо базовых типов существует практически бесконечный класс производных типов, которые формируются из уже существующих и опи- сывают следующие конструкции:
    массивы объектов заданного типа;
    функции, возвращающие объекты заданного типа;
    указатели на объекты заданного типа;
    структуры, содержащие последовательность объектов, возможно, раз- личных заданных типов;
    объединения, каждое из которых может содержать любой из нескольких объектов различных заданных типов.
    В общем случае приведенные методы конструирования объектов мо- гут применяться рекурсивно.
    А 4.4.
    типов
    Тип объекта может снабжаться
    Объявление объекта с квалификатором const указывает на то, что значение далее не будет изменяться; объявляя объект как volatile (изменчивый, непостоянный мы указываем на его особые свойства для выполняемой компи- лятором оптимизации. Ни один из квалификаторов на диапазоны значе- ний и арифметические свойства объектов не влияет. Квалификаторы об- суждаются в
    1   ...   14   15   16   17   18   19   20   21   ...   28


    написать администратору сайта