ОСНОВНЫЕ ТИПЫ ДАННЫХ И ИХ ВНУТРЕННЕЕ ПРЕДСТАВЛЕНИЕ

Алфавит языка

 

В алфавит языка С++ входят:

прописные и строчные буквы латинского алфавита;

цифры 0, 1, 2, 3, 4, 5, 6, 7, 8, 9;

специальные знаки:

“ { } , | [ ] ( ) + - / % \ ; ‘ : < == > _ ! & # ~ . * ^ ? =

Из символов алфавита формируются лексемы языка:

идентификаторы;

ключевые (служебные, иначе зарезервированные ) слова;

константы;

знаки операций;

разделители (знаки пунктуации).

Лексема – это одна из смысловых единиц (имен, констант, зарезервированных слов и т.д.) во входном тексте для компилятора. Лексический анализатор разделяет входной текст, представляемый в виде потока знаков, на группы лексем.

 


Имена

 

Имя ( идентификатор ) состоит из последовательности букв и цифр. Первый символ должен быть буквой. Символ подчерка _ считается буквой. С++ не налагает ограничений на число символов в имени, но некоторые части реализации находятся вне ведения автора компилятора (в частности, загрузчик), и они такие ограничения налагают. Некоторые среды выполнения также делают необходимым расширить или ограничить набор символов, допустимых в идентификаторе. В качестве имени не могут использоваться ключевые слова С++.

Примеры имен:

Hello this_is_a_most_unusually_long_name

DEFINED foO bAr u_name

var0 var1 CLASS

Примеры последовательностей символов, которые не могут использоваться как идентификаторы:

012 $sys class 3var

pay.due foo~bar .name if

Буквы в верхнем и нижнем регистрах считаются различными, поэтому Count и count – различные имена, но вводить имена, лишь незначительно отличающихся друг от друга, нежелательно.

 

1.5. Директивы препроцессора #include и #define

 

Получение исполняемой программы из исходного текста на языке С++ происходит в несколько этапов. На самом первом этапе с исходным текстом программы работает специальная программа – препроцессор. Основная цель препроцессора – закончить формирование исходного текста программы на С++. Затем окончательный текст программы подвергается компиляции. Компиляция завершается генерацией объектного файла. После этого компоновщик формирует загрузочный модуль.

Обычно препроцессор вызывается компилятором автоматически. Однако для упрощения отладки программы Borland C++ включают в себя автономную программу препроцессора CPP.EXE. Результатом ее работы является окончательно сформированный препроцессором файл со всеми включенными файлами и другими выполненными директивами препроцессора.

Директивы препроцессора, называемые часто командными строками, начинаются со специального знака #, помещаемого в первой позиции строки. Директивы препроцессора позволяют программисту:

Описывать макросы, которые уменьшают трудоемкость написания программы и делают текст программы удобным для чтения. Во многих случаях использование макросов вместо функций увеличивает скорость исполнения программы за счет исключения потерь времени на вызов функции, но при этом и увеличиваются размеры загрузочного модуля программы.

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

Организовывать условную компиляцию, то есть в зависимости от заданных параметров получать различный исполняемый код. Условная компиляция позволяет также повышать мобильность программ.

Рассмотрим директивы препроцессора #include и #define.

Директива препроцессора #include позволяет включать в исходный код программы, поступающей на компиляцию, любые текстовые файлы.

Существуют следующие формы директивы:

#include <спецификация_файла>

#include “спецификация_файла”

Препроцессор заменяет директиву #include содержимым заданного файла. Первая форма директивы предполагает, что подключается “стандартный” заголовочный файл, имеющий по традиции расширение .h. Он будет отыскиваться в “стандартных” директориях, то есть в тех директориях, положение которых задано компилятору заранее. Если имя подключаемого файла задано в двойных кавычках, поиск файла выполняется по маршруту, указанному спецификацией файла. Если файл там не найден, просматриваются те же директории, что и в случае задания имени файла в угловых скобках.

Директива #define определяет макрос; общий вид записи директивы:

#define идентификатор_макро тело_макро

Препроцессор просматривает исходный текст и заменяет каждое вхождение лексемы “идентификатор_макро” на лексему (совокупность лексем) “тела_макро”. Расширению не подвергаются лексемы, входящие в состав строковых литералов, комментариев и символьных констант.

Пример:

//Prim1_3.cpp

#define HI “Hello ,dear”

#define EMPTY /*пример пустого тела макро*/

#define BLANK …

#define YES 1

puts (HI); /* расширяется в puts (“Hello , dear”);*/

strcmp(buf , BLANK); /*расширяется в strcmp(buf , “”);*/

puts(“EMPTY”); /* расширение не выполняется внутри” ” */

/*Ни HI , ни EMPTY , ни BLANK не расширяются в комментариях*/

Как частный случай, директива #define может описывать те или иные числовые константы, которые часто называют символическими.

После расширения вновь выполняется просмотр уже расширенного текста, что позволяет организовывать вложенные макрос. Однако если после расширения макрос образуется директива препроцессора, фиксируется ошибка.

Разрешается описывать макросы с параметрами. Для этого макрос следует описывать так:

#define идентификатор_макро (список аргументов ) тело_макро;

В том случае, если тело макроса не умещается в одной строке, его можно разместить на следующих строках, используя символ обратной косой черты. Этот символ и следующий за ним (невидимый) символ перевода строки “игнорируются” компилятором.

Пример:

//Prim1_4.cpp

/*”заливает” экран в текстовом режиме цветом color*/

#include<dos.h>

#define FILI SCREAN (color)_AX=0x0600; /

_SX=0x0000; /

_DX=0x184f; /

_BH=color; /

geninterrupt(0x10);

FILI SCREAN(0x1f); /* синий фон , яркие белые буквы */

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

Используя знаки ## в макросах с параметрами, можно указать компилятору удалить все знаки между символами ##, в том числе и сами символы ##. В результате два формальных параметра сольются, образуя единую лексему. Так можно компоновать, например, идентификаторы или предложения языка С++ из отдельных слов.

В теле макроса с параметрами перед формальным параметром может быть помещен одиночный символ #. Он служит указанием компилятору преобразовать фактический аргумент в строку символов.

//Prim1_5.cpp

#define PRN(number) printf(#number"=%d\n",number);

int scale=25, param=10;

PRN(scale); /*на экране будет напечатано : scale=25*/

PRN(param); /* на экране будет напечатано : param=10*/

При расширении, например, макро PRN(scale) будет заменено строкой printf("scale""=%d/n", scale), но два расположенных в одной строке без разделителей строковых литерала рассматриваются как один, то есть программа выполняет обращение к функции печати.

 

ОСНОВНЫЕ ТИПЫ ДАННЫХ И ИХ ВНУТРЕННЕЕ ПРЕДСТАВЛЕНИЕ

 








Дата добавления: 2017-01-29; просмотров: 438;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.015 сек.