Т. Пратт, М. Зелковиц - Языки программирования - разработка и реализация (4-е издание_ 2002) (1160801), страница 161
Текст из файла (страница 161)
а[33): 9 рюп[Г (": 50Н- га(п", аеаияоп(а.г)): 10 н)п1е(9егс)вг() != Цп'); 11 )) 12 )* Функция преобразояания *! 13 (пг сопчегг (сцаг сн) 14 [гегцгп сн-'0'.) 15 г* Функция словения *! 16 яп1 аааягяоп (ч, и) 17 япг ч[ 3, и; 18 [ (пг ецв,): 19 яиге0, 20 Гаг (3=0: 3<п. )++) яцв-яцв+ч[33: 21 ге[цап яцв; 22 Строка !.
В данной программе должна быть использована стандартная библиотека ввода-вывода, подключаемая через заголовочный файл 51()[о.)). В этой строке записана препроцессорцая команда, которая обрабатывается до начала трансляции. В этом месте происходит включение в программу содержимого файла 51(3)о.)) как части программы. С!прока 2. Определяется целая константа ваха) ге, и ей присваивается значение 9.
Можно было использовать также препроцессориую команду с похожим результатом: Ооеппе вахюге 9 Строка Х В этом месте начинается вычисление. Некоторая функция должна иметь имя ва(п. 582 Приложение. Обзоры языков Строка 4. Объявляется массив з целых чисел с индексом из диапазона значений от 0 до 8. Строка б. Функция дегслаг() определена в файле зло.'и. Она считывает очередной символ со стандартного ввода. Поскольку переменные символьного типа спаг являются подтипами целых чисел, читается целочисленное значение (код) символа. Например, н системах, использующих АБСП-коды, цифра 2 является символом с двоичным значением 0110010, которое в восьмеричной системе равняется 62, а в десятичной — 50. Однако н данной программе требуется численное значение 2, которое и получается в результате действия функции сопчег1() (строки 13-14).
Считанное значение присваивается переменной ~. Обратите внимание на то, что присваиванис здесь являешься просто операцией, а выражение 1=сопнег1(0е1сбаг() ) присваивает следующее введенное число переменной 1 и возвращает его жс в качестве значения етого выражения. Если зто значение нс 0, то выполняются следующие операторы (строки 7-11). Следовательно, если значение ~ равно 0, то цикл завершится, а вместе с ним завершится и программа, так как закончится выполнение процедуры за~ и.
Строка 7. В операторс 1ог последовательно считываются значения массива (с помощью функпии соп»»ег1 и функции Ое(с)»зг из стандартной библиотеки анода-вывода). Первым параметром оператора 1сг является операция присваивания значения переменной (счстчику цикла), выполняемая при входе в зтот оператор цикла; обычно присвошшое значение является начальным значением для цикла (0=0).
Второй параметр является условием продолжения ныполпения цикла (ныполцять цикл, пока )<х), а третий параметр описывает операцию, выполняющуюся в конце каждого шага цикла ().-», то есть добавление единицы к значению переменной )). Строка 8. Этот оператор гог аналогичен предыдущему оператору цикла, цо только на каждом шаге цикла печатает соответствующий злемент массива.
Функция рг~ пг 1 выводит на печать свой первый аргумент, представленный символьной строкой. Последовательность символов $») в строкс вывода указывает, что нужно взять следуклций аргумент функции рг~ п11 и напечатать его н целочисленном формате в том месте строки вывода, где находится зта последовательность. С»прока 10. Программа читает символы до тех пор, пока не встретится символ конца строки. данный оператор ищ ) е имеет пустое тело. Строка 11.
Фигурные скобки завершают блок, начинающийся н строке 6, и тело основной программы, которое начинается в строке 4. Строки 12. Комментарий. Его можно использовать везде, где можно поместить символ пробела. Строка 14. Не обязательно знать АВСП-коды для цифр. Все, что необходимо знать, зто то, что символ ' 0' — это число 0, символ '1' — на единицу болыпе символа '0 ' и имеет значение 1, а '2' — больше ' 0' на 2 и имеет значение 2 и т. д. Выражение сц-'0' вернет требуемое числовое значение для одной цифры, Строки 16 — 17, Здесь приведен старый стиль описания параметров языка С. Имена парамстрон находятся в списке парам етрон, а затем н теле функции следует описание их типов.
Обратите внимание ца то, что границы массинов пс заданы. п.г. с вез П.2.1. Объекты данных Язык С является строго типизированным языком, но в нем существует всего несколько типов, поэтому строгая типизация полезна лишь в минимальной степени. Данные могут быть целочисленными (1п гере г), перечисляемого типа или вещественными с плавающей точкой (Поаг). Структурированные данные представлены массивами, строками (форма массивов) или записями, такими как втгыст или ыпт оп. Элементарные типы данных Переменные и константы.
Идентификаторами в С могут быть любые последовательности букв, цифр и символа подчеркивания ( ), причем они не должны начинаться с цифры. В заголовочных файлах .Ь обычно используются внутренние переменные, имена которых начинаются с символа подчеркивания, так что в пользовательских программах лучше избегать задания идентификаторов, начинающихся с символа подчеркивания. Регистр играет важную роль в языке С, поэтому переменные с именами аЬс и АВ — это разные переменные.
Целые числа можно задавать в обычном формате целых чисел (например, 12, -17) или как восьмеричные литералы с предшествующим 0 (например, 03 — десятичное 3, 011 — десятичное 9, 0100 — десятичзтое 64), Символьные литеральные константы задаются в одинарных кавычках (например, 'А', 'В', '1'). Символ 1п обозначает конец строки, а 10 — это пи(йсимвол, который используется при обработке строк. Действительные АВСП-коды символов можно задавать, используя числовые коды.
Так, 1062 соответствует АВСЦ-коду 62 (восьмеричному) или символу '2'. Дискретные значения можно создавать с помощью перечисляемых типов — другой формы целочисленных данных: елнв иив типа ( список значений ) иив Пример: елыв со1огв ( гев. уе11он. Ы не ) х. у. з: х = геО. у - Ь1не; Значения перечисляемого типа нужно указывать только один раз. Следующее объявление переменных перечисляемого типа со(огв можно записать как елыв со1огв а, Ь, с, Литеральные константы с плаваютцей точкой могут быть записаны в форме числа с десятичной точкой (например, 1. 0, 3 456) или в экспо ненциальн ой форме (например, 1.2е3 = 1200, 12е-1 = .
012). Строковые литералы, илн просто строки, задаются как последовательности символов, заключенные в двойные кавычки ("), например, "аЬс", "1234". Однако строки на самом деле являются строковыми массивами со специальными завершающими пиП-символами (10). Таким образом, строка "123456" на самом деле является последовательностью 1234561 0 и обрабатывается так же, как если бы она была объя влепа одним из следуипцих способов; сиаг аггаучаг(1 = "123456", 7* аггаучаг длиной 7 символов *! сиаг *аггауртг = " 123456". 7* аггауртг указывает на эти сииволы *I Числовые типы данных. Целый тип в языке С имеет несколько разновидностей. Целый тип впог' солсржит наименьшее количество бит, эффективное для 584 Приложение. Обзоры языков данной реализации.
Для многих реализаций С, используемых на персональных компьютерах, этот тип соответствует 16-битному целому числу со знаком, максимальное значение которого может быть 32 767. Он может быть и больше, например 32-битное целое. Тип ]опр является, наоборот, наиболее длинной (в отношении количества бит) реализацией целых чисел, приемлемой для данной конкретной аппаратной части компьютера. Как правило, переменные этого типа занимают 32 бита, а иногда и больше. Тип ) п1 представляет собой наиболее эффективную реализацию для данной аппаратной части.
этот тип () пт ) может совпадать с 5))огс или ]оно или его длина может иметь некоторое промежуточное значение в интервале между значениями длин описанных типов. Как показано в приведенном примере, тип с))аг также является подтипом целого, в данном случае — однобайтным значением. То есть любыми введенными символами можно манипулировать так же, как другими целыми значениями. В языке С нет булевого или логического типа данных; вместо них также используются целые переменные. Истина определена как любое ненулевое целое значение, а ))ояь представляется нулевым значением. Для установки и сброса различных битов в целых числах можно использовать поразрядные операции.
Хотя для хранения различных булевых значений можно использовать несколько битов в отдельном слове (например, двоичное число 101 = десятичное 5 может обозначать «А — истинно,  — ложно, С вЂ” истинноь), для этой цели обычно лучше использовать отдельные переменные типа ]пк Константы можно определять либо при помощи препроцессорной команды №)]е1ч не, как было показано выше, либо при помощи объявления сопзт: сопас иия типа = аначение Указатели. Указатели могут указывать на любые данные. Конструкция *р показывает, что р является указателем на объект. Например, операторы ~п1 *р.
р - 1~ос *) ва1)ос(а)аеоьыпс) ), 0-1. делают следующее; 1. Размещают в памяти указатель р, который будет указывать на целую пере- менную. 2. Отводят достаточно памяти, чтобы разместить там целую переменную, и сохраняют йзначение этой области памяти как и-значение переменной р. 3. Используя )-значение переменной р, помещают целое значение 1 в отведен- ное пространство памяти, на которое указывает р.
Структурированные типы данных Массивы. Индексы одномерных массивов начинаются с 0 (например, ]пса(3]). Многомерные массивы любой размерности можно определить как чот а110]15] Такие массивы сохраняются путем развертывания по строкам, то есть как если бы массив был описан следующим образом: тыпч а110] где тип с~пор — это целый массив длины 5. П.2. С 585 Как говорилось ранее, строки являются массивами символов. Строковые функции обычно используют строки с завершающим пц11-символом (то есть в виде массивов символов, завершающихся пп11-символом: "аЬсбеГ = аЬсбе110). Т 1-значение = и 8 1-значение = и Ьзначение = и+! Ьзнечение = и+2 оп!оп 8 (1п1 А; 1п1 В; 1пт С; 1п1 0;» 1-значение = и+3 е1тист Т (1п1 А; )п1 В; 1п1 С; 1пт 0;» Рис.