Главная страница

Курс на Си. Подбельский. Курс программирования на Си. В., Фомин С. С. Курс программирования на языке Си Учебник


Скачать 1.57 Mb.
НазваниеВ., Фомин С. С. Курс программирования на языке Си Учебник
АнкорКурс на Си
Дата18.02.2023
Размер1.57 Mb.
Формат файлаdocx
Имя файлаПодбельский. Курс программирования на Си.docx
ТипУчебник
#943863
страница3 из 42
1   2   3   4   5   6   7   8   9   ...   42

Служебные слова в конструкциях языка используются по-разному.

Для обозначения типов данных они служат спецификаторами и квалификаторами типов. Последние уточняют свойства обозначен­ных типов данных.

К спецификаторам типов относятся:

  • 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).

Конструкции языка, в которых используются служебные слова, будем определять по мере необходимости. Можно было бы не пере­числять всех служебных слов, а вводить их по мере изложения язы­ка, однако их запрещено использовать в качестве имен, выбираемых программистом, и поэтому для предупреждения возможных ошибок список служебных слов нужен уже на данном этапе.

Добавим еще одно соглашение, обычно соблюдаемое авторами компиляторов и стандартных библиотек языка Си. Идентификато­ры, начинающиеся с одного или двух символов подчеркивания «_», зарезервированы для использования в библиотеках и компилято­рах. Поэтому такие идентификаторы не рекомендуется выбирать в качестве имен в прикладной программе на языке Си. Следующее соглашение относительно имен относится уже не к стандарту и не к реализациям, а отображает стиль оформления текста программы. Рекомендуется при программировании имена констант записывать целиком заглавными буквами.

    1. Литералы

По определению, константа представляет значение, которое не может быть изменено. Синтаксис языка определяет пять типов кон­стант: символы, константы перечисляемого типа, вещественные чис­ла, целые числа и нулевой указатель («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. Целые константы и выбираемые для них типы

Диапазоны значений констант

Тип данных

десятичные

восьмеричные

шестнадцатеричные

от 0

до 32767

от 00

до 077777

от 0x0000

до 0x7FFF

int



от 0100000

до 0177777

от 0x8000

до 0xFFFF

unsigned int

от 32768

до 2147483647

от 020000

до 017777777777

от 0x10000

до 0x7FFFFFFF

long

от 2147483648

до 4294967295

от 020000000000

до 037777777777

от 0x80000000

до 0xFFFFFFFF

unsigned long

до 9223372036854775807

до 0377777777777777777777

до 0x7FFFFFFFFFFFFFFF

long long

> 9223372036854775807

>0377777777777777777777

> 0x7FFFFFFFFFFFFFFF

ошибка

В табл. 1.2 приведены сведения о представлении данных вещест­венных типов.

Таблица 1.2. Данные вещественных типов

Тип данных

Размер, бит

Диапазон абсолютных величин

float

32

от 3.4E-38 до 3.4E+38

double

64

от 1.7E-308 до 1.7E+308

long double

80

от 3.4E-4932 до 1.1E+4932

Вещественная константа 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.
1   2   3   4   5   6   7   8   9   ...   42


написать администратору сайта