Курс на Си. Подбельский. Курс программирования на Си. В., Фомин С. С. Курс программирования на языке Си Учебник
Скачать 1.57 Mb.
|
Служебные слова в конструкциях языка используются по-разному. Для обозначения типов данных они служат спецификаторами и квалификаторами типов. Последние уточняют свойства обозначенных типов данных. К спецификаторам типов относятся: char - символьный; double - вещественный двойной точности с плавающей точкой; enum - перечисляемый тип (перечисление) - определение целочисленных констант, для каждой из которых вводятся имя и значение; float - вещественный с плавающей точкой; int - целый; long - целый увеличенной длины (длинное целое); long long - целый тип длиной не менее 64 бит; short - целый уменьшенной длины (короткое целое); struct - структура (структурный тип); signed - знаковый, то есть целое со знаком (старший бит считается знаковым); union - объединение (объединяющий тип); unsigned - беззнаковый, то есть целое без знака (старший бит не считается знаковым); void - отсутствие значения; typedef - вводит синоним обозначения типа (определяет сокращенное наименование для обозначения типа). Квалификаторы типа: const - квалификатор объекта, имеющего постоянное значение, то есть доступного только для чтения; volatile - квалификатор объекта, значение которого может измениться без явных указаний программиста. Квалификаторы типа информируют компилятор о необходимости и (или) возможности особой обработки объектов в процессе оптимизации кода программы. Для обозначения классов памяти используются: auto - автоматический; extern - внешний; register - регистровый; static - статический. Для построения операторов используются: break - завершить, прервать (например, цикл или переключатель); case - определяет вариант в операторе switch; continue - завершить текущую итерацию цикла (продолжить цикл, перейдя к следующей итерации); default - определяет действия при отсутствии нужного варианта в операторе switch; do - выполнять (заголовок оператора цикла с постусловием); Базовые понятия языка else - входит в оператор if, определяя альтернативную ветвь; for - для (заголовок оператора параметрического цикла); goto - перейти (безусловный переход); if- «если» - обозначение условного оператора; return - возврат (из функции); sizeof - операция определения размера операнда (в байтах); switch - переключатель; while - «пока» (заголовок цикла с предусловием или завершение цикла do). Конструкции языка, в которых используются служебные слова, будем определять по мере необходимости. Можно было бы не перечислять всех служебных слов, а вводить их по мере изложения языка, однако их запрещено использовать в качестве имен, выбираемых программистом, и поэтому для предупреждения возможных ошибок список служебных слов нужен уже на данном этапе. Добавим еще одно соглашение, обычно соблюдаемое авторами компиляторов и стандартных библиотек языка Си. Идентификаторы, начинающиеся с одного или двух символов подчеркивания «_», зарезервированы для использования в библиотеках и компиляторах. Поэтому такие идентификаторы не рекомендуется выбирать в качестве имен в прикладной программе на языке Си. Следующее соглашение относительно имен относится уже не к стандарту и не к реализациям, а отображает стиль оформления текста программы. Рекомендуется при программировании имена констант записывать целиком заглавными буквами. Литералы По определению, константа представляет значение, которое не может быть изменено. Синтаксис языка определяет пять типов констант: символы, константы перечисляемого типа, вещественные числа, целые числа и нулевой указатель («null-указатель»). Все константы, кроме нулевого указателя, отнесены в языке Си к арифметическим. Символы, или символьные константы. Для изображения отдельных знаков, имеющих индивидуальные внутренние коды, используются символьные константы. Каждая символьная константа - это лексема, которая состоит из изображения символа и ограничивающих апострофов. Например: 'А', 'а' , 'В' , '8' , '0' , '+' , ';' и т. д. Внутри апострофов можно записать любой символ, изображаемый на дисплее или принтере в текстовом режиме. Однако в ЭВМ используются и коды, не имеющие графического представления на экране дисплея, клавиатуре или принтере. Примерами таких кодов служит код перехода курсора дисплея на новую строку или код возврата каретки (возврат курсора к началу текущей строки). Для изображения в программе соответствующих символьных констант используются комбинации из нескольких символов, имеющих графическое представление. Каждая такая комбинация начинается с символа '\' (обратная косая черта - backslash). Такие наборы литер, начинающиеся с символа '\', в литературе по языку Си называют управляющими последовательностями. Ниже приводится их список: '\n' - перевод строки; '\t' - горизонтальная табуляция; '\r' - возврат каретки (курсора) к началу строки; '\\' - обратная косая черта \; '\'' - апостроф (одиночная кавычка); '\"' - кавычка (символ двойной кавычки); '\0' - нулевой символ; '\a' - сигнал-звонок; '\b' - возврат на одну позицию (на один символ); '\f' - перевод (прогон) страницы; '\v' - вертикальная табуляция; '\?' - знак вопроса. Обратите внимание на то, что перечисленные константы изображаются двумя и более литерами, а обозначают они одну символьную константу, имеющую индивидуальный двоичный код. Управляющие последовательности являются частным случаем эскейп-последова- тельностей (ESC-sequence), к которым также относятся лексемы вида '\ddd', '\xhh' или '\Xhh'. '\ddd' - восьмеричное представление любой символьной константы. Здесь d - восьмеричная цифра (от 0 до 7). Например, '\017' или '\233'. '\xhh' или '\Xhh' - шестнадцатеричное представление любой символьной константы. Здесь h - шестнадцатеричная цифра (от 0 до F). Например, '\x0b', '\x1A' и т. д. В приложении 1 приведены таблицы числовых кодов символов. Зная значения кодов, можно изображать в виде эскейп-последова- тельности любой символ, как воспроизводимый в текстовом режиме на дисплее (принтере), так и неизображаемый (управляющий). Символьная константа (символ) имеет целый тип, то есть символы можно использовать в качестве целочисленных операндов в выражениях. Целые константы. Синтаксисом языка определены целые константы: десятичные, шестнадцатеричные и восьмеричные. Основание определяется префиксом в записи константы. Для десятичных констант префикс не используется. Десятичные целые определены как последовательности десятичных цифр, начинающиеся не с нуля (если это не число нуль): 44 684 0 1024 Последовательность цифр, начинающаяся с 0 и не содержащая десятичных цифр старше 7, воспринимается как восьмеричная константа: 016 - восьмеричное представление десятичного целого 14. Последовательность шестнадцатеричных цифр (0, 1, ..., 9, A, B, C, D, E, F), перед которой записаны символы 0x или 0X, считается шестнадцатеричной константой: 0x16 - шестнадцатеричное представление десятичного целого 22; 0XFF - шестнадцатеричное представление десятичного целого 255. Каждая конкретная реализация языка вводит свои ограничения на предельные значения констант. Например, компилятор Turbo С в отношении целых констант соответствует стандарту и допускает целые десятичные от 0 до 32767, а длинные целые (см. ниже тип long) - от 0 до 2147483647. Вещественные константы. Для представления вещественных (нецелых) чисел используются константы, представляемые в памяти ЭВМ в форме с плавающей точкой. Каждая вещественная константа состоит из следующих частей: целая часть (десятичная целая константа); десятичная точка; дробная часть (десятичная целая константа); признак показателя «e» или «Е»; показатель десятичной степени (десятичная целая константа, возможно, со знаком). При записи констант с плавающей точкой могут опускаться целая или дробная часть (но не одновременно); десятичная точка или символ экспоненты с показателем степени (но не одновременно). Примеры констант с плавающей точкой: 44. 3.14159 44e0 .314159E1 0.0 Предельные значения и типы арифметических констант. Машинное представление (код) программы на языке Си предполагает, что каждая константа, введенная в программе, занимает в ЭВМ некоторый участок памяти. Размеры этого участка памяти и интерпретация его содержимого определяются типом соответствующей константы. В приложении 2 приведены допустимые стандартом предельные значения для разных типов данных. Почти все компиляторы отводят символьным константам (символам) по одному байту (восемь бит). Тем самым вводится ограничение на все разнообразие символьных констант - их внутренние коды должны находиться в диапазоне от 0 до 255. В языках многих стран мира не весь набор символов (букв и знаков) может быть представлен с помощью одного байта. В настоящее время ведется систематическая международная работа по созданию многобайтового универсального кода (unicode), в рамках которого можно представлять символы почти всех алфавитов. Однако рассмотрение многобайтовых кодов в рамках настоящего пособия представляется нам преждевременным. Для целых и вещественных констант каждая реализация компилятора с языка Си может определять свои ограничения. Кроме того, необходимо учитывать платформу (аппаратная и программная составляющие), в среде которой реализован компилятор с языка Си, и платформу, в среде которой будет эксплуатироваться созданный программный продукт (см. приложение 4). В табл. 1.1 приведены пределы, исходя из которых компиляторы, реализованные на современных персональных компьютерах (ПК), выбирают типы целых констант. Например, все целые константы в диапазоне от 0 до 32767 имеют тип int, то есть будут представлены в памяти участками в 2 байта (16 бит). Таблица 1.1. Целые константы и выбираемые для них типы
В табл. 1.2 приведены сведения о представлении данных вещественных типов. Таблица 1.2. Данные вещественных типов
Вещественная константа 3.141592653589793 будет воспринята как имеющая тип double, и ей будет выделено 8 байт (64 бита). Тот же тип выбирается для константы 3.14, так как по умолчанию всем вещественным константам присваивается тип double. Если программиста не устраивает тип, который компилятор приписывает константе, то тип можно явно указать в записи константы с помощью суффиксов: F (или f) - float (для вещественных), U (или u) - unsigned (для целых), L (или l) - long (для целых и вещественных). Например: 3.14159F - константа типа float (выделяется 4 байта); 3.14L - константа типа long double (выделяется 10 байт). С помощью суффикса U (или u) можно представить целую константу в виде беззнакового целого. Например: 50000U - константа типа unsigned int. Константе 50000U выделяются 2 байта (вместо четырех, как было бы при отсутствии суффикса (см. табл. 1.1)). В этом случае, то есть для unsigned int, знаковый бит используется для представления одного из разрядов кода числа, и диапазон значений становится от 0 до 65535. Суффикс L (или l) позволяет выделить целой константе 4 байта (32 бита): 500L - константа типа long, которой выделяется 4 байта; 0L - целая константа типа long длиной 4 байта. Совместное использование в любом порядке суффиксов U (или u) и L (или l) позволяет приписать целой константе тип unsigned long, и она займет в памяти 32 разряда (бита), причем знаковый разряд будет использоваться для представления разряда кода (а не знака). Примеры: 0LU - целая константа типа unsigned long длиной 4 байта; 2424242424UL - константа типа unsigned long; 123LL - целая константа типа long long. Нулевой указатель. Null-указатель, называемый нулевым указателем, - это единственная неарифметическая константа. Ее роль и функциональные возможности станут ясны при изучении аппарата указателей (см. следующие главы). В конкретных реализациях null- указатель может быть представлен либо как 0, либо как 0L, либо как именованная константа NULL. Здесь нужно отметить, что значение константы NULL не обязано быть нулем и имеет право не совпадать с кодом символа '0'. Константы перечисляемого типа. Целочисленные именованные константы можно вводить с помощью перечисления: enum тип_перечисления {список_именованных_констант}, где enum - служебное слово, вводящее перечисление; тип_пере- числения - его название - необязательный произвольный идентификатор; список_именованных_констант - разделенная запятыми последовательность идентификаторов или именованных констант вида: имя_константы=значение_константы. Примеры: enum {ONE=1, TWO, THREE, FOUR}; enum DAY {SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY}; enum BOOLEAN {NO, YES}; Если в списке нет ни одного элемента со знаком '=', то значения констант начинаются с 0 и увеличиваются на 1 слева направо. Таким образом, NO равно 0, YES равно 1, SUNDAY имеет значение 0, и FRIDAY имеет значение 5. Именованная константа со знаком '=' получает соответствующее значение (ONE=1), а следующие за ней именованные константы без явных значений увеличиваются на 1 каждая. В нашем примере TWO равно 2, THREE равно 3, FOUR равно 4. |