двойные кавычки, как, наприимер,"...". Строка имеет тип
"массив массивов" и класс памяти STATIC (см. Пункт 4 ниже).
Строка инициализирована указанными в ней символами. Все
строки, даже идентично записанные, считаются различными.
Компилятор помещает в конец каждой строки нулевой байт \0, с
тем чтобы просматривающая строку программа могла определить
ее конец. Перед стоящим внутри строки символом двойной ка-
вычки " должен быть поставлен символ обратной косой черты \;
кроме того, могут использоваться те же условия последова-
тельности, что и в символьных константах. И последнее, об-
ратная косая черта \, за которой непосредственно следует
символ новой строки, игнорируется.
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" основывает интерпретацию идентификатора на двух
признаках идентификатора: его классе памяти и его типе.
Класс памяти определяет место и время хранения памяти, свя-
занной с идентификатором; тип определяет смысл величин, на-
ходящихся в памяти, определенной под идентификатором.
Имеются четыре класса памяти: автоматическая, статичес-
кая, внешняя и регистровая. Автоматические переменные явля-
ются локальными для каждого вызова блока и исчезают при вы-
ходе из этого блока. Статические переменные являются локаль-
ными, но сохраняют свои значения для следующего входа в блок
по существу является одномерным массивом, каждый элемент ко-
Внешние переменные существуют и сохраняют свои значения в
течение выполнения всей программы и могут использоваться для
связи между функциями, в том числе и между независимо ском-
пилированными функциями. Регистровые переменные хранятся
(ели это возможно) в быстрых регистрах машины; подобно авто-
матическим переменным они являются локальными для каждого
блока и исчезают при выходе из этого блока.
В языке "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-значе-
ние.
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. Указатели и целые
Целое или длинное целое может быть прибавлено к указате-
лю или вычтено из него; в этом случае первая величина преоб-
разуется так, как указывается в разделе описания операции
сложения.
Два указателя на объекты одинакового типа могут быть
вычтены; в этом случае результат преобразуется к целому, как
указывается в разделе описания операции вычитания.
14.5. Целое без знака
Всякий раз, когда целое без знака объединяется с простым
целым, простое целое преобразуется в целое без знака и ре-
зультат оказывается целым без знака. Значением является наи-
меньшее целое без знака, соответствующее целому со знаком
(по модулю 2**размер слова). В двоичном дополнительном пред-
ставлении это преобразование является чисто умозрительным и
не изменяет фактическую комбинацию битов.
Когда целое без знака преобразуется к типу LONG, значе-
ние результата совпадает со значением целого без знака. Та-
ким образом, это преобразование сводится к добавлению нулей
слева.
14.6. Арифметические преобразования
Подавляющее большинство операций вызывает преобразование
и определяет типы результата аналогичным образом. Приводимая
ниже схема в дальнейшем будет называться "обычными арифмети-
ческими преобразованиями".
Сначала любые операнды типа CHAR или SHORT преобразуются в
INT, а любые операнды типа FLOAT преобразуются в DOUBLE.
Затем, если какой-либо операнд имеет тип DOUBLE, то другой
преобразуется к типу DOUBLE, и это будет типом результата.
В противном случае, если какой-либо операнд имеет тип LONG,
то другой операнд преобразуется к типу LONG, и это и будет
типом результата.
В противном случае, если какой-либо операнд имеет тип
UNSIGNED, то другой операнд преобразуется к типу UNSIGNED,
и это будет типом результата.
В противном случае оба операнда будут иметь тип INT, и это
будет типом результата.
15. Выражения
Старшинство операций в выражениях совпадает с порядком
следования основных подразделов настоящего раздела, начиная
с самого высокого уровня старшинства. Так, например, выраже-
ниями, указываемыми в качестве операндов операции +
(п.15.4), Являются выражения, определенные в п.п.15.1-15.3.
Внутри каждого подраздела операции имеет одинаковое старшин-
ство. В каждом подразделе для описываемых там операций ука-
зывается их ассоциативность слева или справа. Старшинство и
ассоциативность всех операций в выражениях резюмируются в
грамматической сводке в п.18.
В противном случае порядок вычислений выражений не опре-
делен. В частности, компилятор считает себя в праве вычис-
лять подвыражения в том порядке, который он находит наиболее
эффективным, даже если эти подвыражения приводят к побочным
эффектам. Порядок, в котором происходят побочные эффекты, не
специфицируется. Выражения, включающие коммутативные и ассо-
циативные операции ( *,+,&,!,^ ), могут быть переупорядочены
произвольным образом даже при наличии круглых скобок; чтобы
вынудить определенный порядок вычислений, в этом случае не-
обходимо использовать явные промежуточные переменные.
При вычислении выражений обработка переполнения и про-
верка при делении являются машинно-зависимыми. Все существу-
ющие реализации языка "C" игнорируют переполнение целых; об-
работка ситуаций при делении на 0 и при всех особых случаях
с плавающими числами меняется от машины к машине и обычно
выполняется с помощью библиотечной функции.
15.1. Первичные выражения
Первичные выражения, включающие ., ->, индексацию и об-