Смекни!
smekni.com

другое одновременно) может отсутствовать. Каждая плавающая

константа считается имеющей двойную точность.

10.5. Строки

Строка - это последовательность символов, заключенная в

двойные кавычки, как, наприимер,”...”. Строка имеет тип

“массив массивов” и класс памяти STATIC (см. Пункт 4 ниже).

Строка инициализирована указанными в ней символами. Все

строки, даже идентично записанные, считаются различными.

Компилятор помещает в конец каждой строки нулевой байт \0, с

тем чтобы просматривающая строку программа могла определить

ее конец. Перед стоящим внутри строки символом двойной ка-

вычки “ должен быть поставлен символ обратной косой черты \;

кроме того, могут использоваться те же условия последова-

тельности, что и в символьных константах. И последнее, об-

ратная косая черта \, за которой непосредственно следует

символ новой строки, игнорируется.

· 188 -

10.6. Характеристики аппаратных средств

Следующая ниже таблица суммирует некоторые свойства ап-

паратного оборудования, которые меняются от машины к машине.

Хотя они и влияют на переносимость программ, на практике они

представляют маленькую проблему, чем это может казаться за-

ранее.

Таблица 1

DEC PDP-11 HONEYWELL IBM 370 INTERDATA 8/32

ASCII ASCII EBCDIC ASCII

CHAR 8 BITS 9 BITS 8 BITS 8 BITS

INT 16 36 32 32

SHORT 16 36 16 16

LONG 32 36 32 32

FLOAT 32 36 32 32

DOUBLE 64 72 64 64

RANGE -38/+38 -38/+38 -76/+76 -76/+76

11. Синтаксическая нотация

В используемой в этом руководстве синтаксической нотации

синтаксические категории выделяются курсивом (прим. перев.:

в настоящее время синтексические категории вместо курсивом

выделяются подчеркиванием), а литерные слова и символы -

жирным шрифтом. Альтернативные категории перечисляются на

отдельных строчках. Необязательный символ, терминальный или

нетерминальный, указывается индексом “необ”, так что

\( выражение

--------- необ \)

указывает на необязательное выражение, заключенное в фигур-

ных скобках. Синтаксис суммируется в пункте 18.

12. Что в имене тебе моем?

Язык “C” основывает интерпретацию идентификатора на двух

признаках идентификатора: его классе памяти и его типе.

Класс памяти определяет место и время хранения памяти, свя-

занной с идентификатором; тип определяет смысл величин, на-

ходящихся в памяти, определенной под идентификатором.

Имеются четыре класса памяти: автоматическая, статичес-

кая, внешняя и регистровая. Автоматические переменные явля-

ются локальными для каждого вызова блока и исчезают при вы-

ходе из этого блока. Статические переменные являются локаль-

ными, но сохраняют свои значения для следующего входа в блок

даже после того, как управление передается за пределы блока.

Внешние переменные существуют и сохраняют свои значения в

течение выполнения всей программы и могут использоваться для

связи между функциями, в том числе и между независимо ском-

пилированными функциями. Регистровые переменные хранятся

(ели это возможно) в быстрых регистрах машины; подобно авто-

матическим переменным они являются локальными для каждого

блока и исчезают при выходе из этого блока.

· 189 -

В языке “C” предусмотрено несколько основных типов

объектов:

объекты, написанные как символы (CHAR), достаточно вели-

ки, чтобы хранить любой член из соответствующего данной реа-

лизации внутреннего набора символов, и если действительный

символ из этого набора символов хранится в символьной пере-

менной, то ее значение эквивалентно целому коду этого симво-

ла. В символьных переменных можно хранить и другие величины,

но реализация будет машинно-зависимой.

Можно использовать до трех размеров целых, описываемых

как SHORT INT, INT и LONG INT. Длинные целые занимают не

меньше памяти, чем короткие, но в конкретной реализации мо-

жет оказаться, что либо короткие целые, либо длинные целые,

либо те и другие будут эквивалентны простым целым. “Простые”

целые имеют естественный размер, предусматриваемый архиитек-

турой используемой машины; другие размеры вводятся для удво-

летворения специальных потребностей.

Целые без знака, описываемые как UNSIGNED, подчиняются

законам арифметики по модулю 2**N, где N - число битов в их

представлении. (На PDP-11 длинные величины без знака не пре-

дусмотрены).

Плавающие одинарной точности (FLOAT) и плавающие двойной

точности (DOUBLE) в некоторых реализациях могут быть синони-

мами.

Поскольку объекты упомянутых выше типов могут быть ра-

зумно интерпретированы как числа, эти типы будут называться

арифметическими. типы CHAR и INT всех размеров совместно бу-

дут называться целочисленными. Типы FLOAT и DOUBLE совместно

будут называться плавающими типами.

Кроме основных арифметических типов существует концепту-

ально бесконечный класс производных типов, которые образуют-

ся из основных типов следующим образом:

массивы объектов большинства типов;

функции, которые возвращают объекты заданного типа;

указатели на объекты данного типа;

структуры, содержащие последовательность объектов

различных типов;

объединения, способные содержать один из нескольких

объектов различных типов.

Вообще говоря, эти методы построения объектов могут при-

меняться рекурсивно.

13. Объекты и L-значения

Объект является доступным обработке участком памяти;

L-значение - это выражение, ссылающееся на объект. Очевидным

примером выражения L-значения является идентификатор. Сущес-

твуют операции, результатом которых являются L-значения; ес-

ли, например, E - выражение указанного типа, то *E является

выражением L-значения, ссылающимся на объект E. Название

“L-значение” происходит от выражения присваивания E1=E2, в

котором левая часть должна быть выражением L-значения. При

последующем обсуждении каждой операции будет указываться,

ожидает ли она операндов L-значения и выдает ли она L-значе-

ние.

· 190 -

14. Преобразования

Ряд операций может в зависимости от своих операндов вы-

зывать преобразование значение операнда из одного типа в

другой. В этом разделе объясняются результаты, которые сле-

дует ожидать от таких преобразований. В п. 14.6 Подводятся

итоги преобразований, требуемые большинством обычных опера-

ций; эти сведения дополняются необходимым образом при обсуж-

дении каждой операции.

14.1. Символы и целые

Символ или короткое целое можно использовать всюду, где

можно использовать целое. Во всех случаях значение преобра-

зуется к целому. Преобразование более короткого целого к бо-

лее длинному всегда сопровождается знаковым расширением; це-

лые являются величинами со знаком. Осуществляется или нет

знаковое расширение для символов, зависит от используемой

машины, но гарантируется, что член стандартного набора сим-

волов неотрицателен. из всех машин, рассматриваемых в этом

руководстве, только PDP-11 осуществляет знаковое расширение.

область значений символьных переменных на PDP-11 меняется от

· 128 до 127; символы из набора ASC11 имеют положительные

значения. Символьная константа, заданная с помощью восьме-

ричной условной последовательности, подвергается знаковому

расширению и может оказаться отрицательной; например, '\377'

имеет значение -1.

Когда более длинное целое преобразуется в более короткое

или в CHAR, оно обрезается слева; лишние биты просто отбра-

сываются.

14.2. Типы FLOAT и DOUBLE

Вся плавающая арифметика в “C” выполняется с двойной

точностью каждый раз, когда объект типа FLOAT появляется в

выражении, он удлиняется до DOUBLE посредством добавления

нулей в его дробную часть. когда объект типа DOUBLE должен

быть преобразован к типу FLOAT, например, при присваивании,

перед усечением DOUBLE округляется до длины FLOAT.

14.3. Плавающие и целочисленные величины

Преобразование плавающих значений к целочисленному типу

имеет тенденцию быть до некоторой степени машинно-зависимым;

в частности направление усечения отрицательных чисел меняет-

ся от машине к машине. Результат не определен, если значение

не помещается в предоставляемое пространство.

Преобразование целочисленных значений в плавающие выпол-

няется без осложнений. Может произойти некоторая потеря точ-

ности, если для результата не содержится достаточного коли-

чества битов.

14.4. Указатели и целые

Целое или длинное целое может быть прибавлено к указате-

лю или вычтено из него; в этом случае первая величина преоб-

разуется так, как указывается в разделе описания операции

сложения.

· 191 -

Два указателя на объекты одинакового типа могут быть

вычтены; в этом случае результат преобразуется к целому, как

указывается в разделе описания операции вычитания.

14.5. Целое без знака

Всякий раз, когда целое без знака объединяется с простым

целым, простое целое преобразуется в целое без знака и ре-

зультат оказывается целым без знака. Значением является наи-

меньшее целое без знака, соответствующее целому со знаком

(по модулю 2**размер слова). В двоичном дополнительном пред-

ставлении это преобразование является чисто умозрительным и

не изменяет фактическую комбинацию битов.

Когда целое без знака преобразуется к типу LONG, значе-

ние результата совпадает со значением целого без знака. Та-

ким образом, это преобразование сводится к добавлению нулей

слева.

14.6. Арифметические преобразования

Подавляющее большинство операций вызывает преобразование

и определяет типы результата аналогичным образом. Приводимая

ниже схема в дальнейшем будет называться “обычными арифмети-

ческими преобразованиями”.

Сначала любые операнды типа CHAR или SHORT преобразуются в

INT, а любые операнды типа FLOAT преобразуются в DOUBLE.