Керниган и Ритчи - Язык программирования Си (793773), страница 13
Текст из файла (страница 13)
Это значит, что каждая строка, длина которой превышает n, должна печататьсяс переносом на следующие строки. Место переноса следует "искать" после последнего символа, отличного отсимвола-разделителя, расположенного левее n-й позиции. Позаботьтесь о том, чтобы ваша программа веласебя разумно в случае очень длинных строк, а также когда до n-й позиции не встречается ни одного символапробела или табуляции.Упражнение 1.23. Напишите программу, убирающую все комментарии из любой Си-программы.
Не забудьтедолжным образом обработать строки символов и строковые константы. Комментарии в Си не могут бытьвложены друг в друга.Упражнение 1.24. Напишите программу, проверяющую Си-программы на элементарные синтаксическиеошибки вроде несбалансированности скобок всех видов. Не забудьте о кавычках (одиночных и двойных),эскейп-последовательностях (\...) и комментариях. (Это сложная программа, если писать ее для общегослучая.)2. Типы, операторы и выраженияПеременные и константы являются основными объектами данных, с которыми имеет дело программа.Переменные перечисляются в объявлениях, где устанавливаются их типы и, возможно, начальные значения.Операции определяют действия, которые совершаются с этими переменными.
Выражения комбинируютпеременные и константы для получения новых значений, Тип объекта определяет множество значений,которые этот объект может принимать, и операций, которые над ними могут выполняться. Названные"кирпичики" и будут предметом обсуждения в этой главе.Стандартом ANSI было утверждено значительное число небольших изменений и добавлений к основнымтипам и выражениям. Любой целочисленный тип теперь может быть со знаком, signed, и без знака,unsigned. Предусмотрен способ записи беззнаковых констант и шестнадцатеричных символьных констант.Операции с плавающей точкой допускаются теперь и с одинарной точностью.
Введен тип long double,обеспечивающий повышенную точность. Строковые константы конкатенируются ("склеиваются") теперь вовремя компиляции. Частью языка стали перечисления (enum), формализующие для типа установку диапазоназначений. Объекты для защиты их от каких-либо изменений разрешено помечать как const. В связи свведением новых типов расширены правила автоматического преобразования из одного арифметическоготипа в другой.2.1. Имена переменныхХотя мы ничего не говорили об этом в главе 1, но существуют некоторые ограничения на задание именпеременных и именованных констант. Имена составляются из букв и цифр; первым символом должна бытьбуква.
Символ подчеркивания "_" считается буквой; его иногда удобно использовать, чтобы улучшитьвосприятие длинных имен переменных. Не начинайте имена переменных с подчеркивания, так как многиепеременные библиотечных программ начинаются именно с этого знака. Большие (прописные) и малые(строчные) буквы различаются, так что х и X — это два разных имени. Обычно в программах на Си малымибуквами набирают переменные, а большими — именованные константы.Для внутренних имен значимыми являются первые 31 символ4. Для имен функций и внешних переменныхчисло значимых символов может быть меньше 31, так как эти имена обрабатываются ассемблерами изагрузчиками и языком не контролируются. Уникальность внешних имен гарантируется только в пределах 6символов, набранных безразлично в каком регистре.
Ключевые слова if, else, int, float и т. д.зарезервированы, и их нельзя использовать в качестве имен переменных. Все они набираются на нижнемрегистре (т. е. малыми буквами).Разумно давать переменным осмысленные имена в соответствии с их назначением, причем такие, чтобы ихбыло трудно спутать друг с другом. Мы предпочитаем короткие имена для локальных переменных, особеннодля счетчиков циклов, и более длинные для внешних переменных.2.2. Типы и размеры данныхВ Си существует всего лишь несколько базовых типов:char— единичный байт, который может содержать один символ из допустимого символьногонабора;int— целое, обычно отображающее естественное представление целых в машине;float— число с плавающей точкой одинарной точности;double— число с плавающей точкой двойной точности.4Это, как и другие ограничения на длину имен, является минимальными требованиями стандарта.
Компиляторы могутподдерживать и имена большей длины. — Примеч. корр.Имеется также несколько квалификаторов, которые можно использовать вместе с указанными базовымитипами. Например, квалификаторы short (короткий) и long (длинный) применяются к целым:short int sh;long int counter;В таких объявлениях слово int можно опускать, что обычно и делается.Если только не возникает противоречий со здравым смыслом, short int и long int должны быть разнойдлины, a int соответствовать естественному размеру целых на данной машине. Чаще всего дляпредставления целого, описанного с квалификатором short, отводится 16 битов, с квалификатором long —32 бита, а значению типа int — или 16, или 32 бита.
Разработчики компилятора вправе сами выбиратьподходящие размеры, сообразуясь с характеристиками своего компьютера и соблюдая следующиеограничения: значения типов short и int представляются по крайней мере 16 битами; типа long — покрайней мере 32 битами; размер short не больше размера int, который в свою очередь не большеразмера long.Квалификаторы signed (со знаком) или unsigned (без знака) можно применять к типу char и любомуцелочисленному типу.
Значения unsigned всегда положительны или равны нулю и подчиняются законамарифметики по модулю 2n, где n — количество битов в представлении типа. Так, если значению charотводится 8 битов, то unsigned char имеет значения в диапазоне от 0 до 255, a signed char — от -128до 127 (в машине с двоичным дополнительным кодом).
Являются ли значения типа просто char знаковымиили беззнаковыми, зависит от реализации, но в любом случае коды печатаемых символов положительны.Тип long double предназначен для арифметики с плавающей точкой повышенной точности. Как и в случаецелых, размеры объектов с плавающей точкой зависят от реализации; float, double и long doubleмогут представляться одним размером, а могут двумя или тремя разными размерами.Именованные константы для всех размеров вместе с другими характеристиками машины и компиляторасодержатся в стандартных заголовочных файлах <limits.h> и <float.h> (см.
приложение В).Упражнение 2.1. Напишите программу, которая будет выдавать диапазоны значений типов char, short,int и long, описанных как signed и как unsigned, с помощью печати соответствующих значений изстандартных заголовочных файлов и путем прямого вычисления. Определите диапазоны чисел с плавающейточкой различных типов. Вычислить эти диапазоны сложнее.2.3. КонстантыЦелая константа, например 1234, имеет тип int. Константа типа long завершается буквой l или L, например123456789L; слишком большое целое, которое невозможно представить как int, будет представлено какlong. Беззнаковые константы заканчиваются буквой u или U, а окончание ul или UL говорит о том, что типконстанты unsigned long.Константы с плавающей точкой имеют десятичную точку (123.4), или экспоненциальную часть (1е-2), илиже и то и другое.
Если у них нет окончания, считается, что они принадлежат к типу double. Окончание f илиF указывает на тип float, а l или L — на тип long double.Целое значение помимо десятичного может иметь восьмеричное или шестнадцатеричное представление.Если константа начинается с нуля, то она представлена в восьмеричном виде, если с 0х или с 0Х, то — вшестнадцатеричном. Например, десятичное целое 31 можно записать как 037 или как 0X1F. Записивосьмеричной и шестнадцатеричной констант могут завершаться буквой L (для указания на тип long) и U(если нужно показать, что константа беззнаковая).
Например, константа 0XFUL имеет значение 15 и типunsigned long.Символьная константа есть целое, записанное в виде символа, обрамленного одиночными кавычками,например 'х'. Значением символьной константы является числовой код символа из набора символов наданной машине. Например, символьная константа '0' в кодировке ASCII имеет значение 48, котороеникакого отношения к числовому значению 0 не имеет. Когда мы пишем '0' , а не какое-то значение(например, 48), зависящее от способа кодировки, мы делаем программу независимой от частного значениякода, к тому же она и легче читается.
Символьные константы могут участвовать в операциях над числамиточно так же, как и любые другие целые, хотя чаще они используются для сравнения с другими символами.Некоторые символы в символьных и строковых константах записываются с помощью эскейппоследовательностей, например \n (символ новой строки); такие последовательности изображаются двумясимволами, но обозначают один. Кроме того, произвольный восьмеричный код можно задать в виде'\ooo'где ooo — одна, две или три восьмеричные цифры (0…7) или'\xhh'где hh — одна, две или более шестнадцатеричные цифры (0…9, а…f, А…F).
Таким образом, мы могли бынаписать#define VTAB '\013' /* вертикальная табуляция в ASCII */#define BELL '\007' /* звонок В ASCII */или в шестнадцатеричном виде:#define VTAB '\xb' /* вертикальная табуляция в ASCII */#define BELL '\x7' /* звонок в ASCII */Полный набор эскейп-последовательностей таков:\асигнал-звонок\\обратная наклонная черта\bвозврат-на-шаг (забой)\?знак вопроса\fперевод-страницы\’одиночная кавычка\nновая-строка\”двойная кавычка\rвозврат-каретки\oooвосьмеричный код\tгоризонтальная-табуляция\xhhшестнадцатеричный код\vвертикальная-табуляцияСимвольная константа '\0' — это символ с нулевым значением, так называемый символ null. Вместопросто 0 часто используют запись '\0', чтобы подчеркнуть символьную природу выражения, хотя и в том идругом случае запись обозначает нуль.Константные выражения — это выражения, оперирующие только с константами.
Такие выражениявычисляются во время компиляции, а не во время выполнения, и поэтому их можно использовать в любомместе, где допустимы константы, как, например, в#define MAXLINE 1000char line[MAXLINE+1];или в#define LEAP 1 /* in leap years - в високосные годы */int days[31+28+LEAP+31+30+31+30+31+31+30+31+30+31];Строковая константа, или строковый литерал, — это нуль или более символов, заключенных в двойныекавычки, как, например,"Я строковая константа"или"" /* пустая строка */Кавычки не входят в строку, а служат только ее ограничителями.














