рефераты

рефераты

 
 
рефераты рефераты

Меню

Реферат: Turbo C++ Programer`s guide рефераты

суффикс-целого-без-знака  <суффикс-длинного-целого>

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

Грамматические правила структуры фраз и лексики языка

Грамматические правила лексикиязыка Turbo C++ описаны на стр. 5 - 58 оригинала; грамматические правила структуры фраз Turbo C++ описаны на стр. 58 - 98 оригинала.

Грамматические правила лексики языка рассматриваются с точки зрения существованияразличных категорий слово-ориентированных языковых единиц,называемых лексемами, распознаваемых компилятором. Грамматические правила структуры фраз подробно определяют допустимые способы группирования этих лексем в выражения, операторы и прочие смысловые единицы языка.

Лексемы Turbo C++ образуются из последовательности операций, выполняемых с вашейпрограммой компилятором и препроцессором языка.

Программа на Turbo C++ начинает свое существованиекак последовательность ACSII-символов,представляющих собой ее исходный код, создаваемый нажатиями клавиш при работе в подходящем текстовом редакторе (например, в собственном редакторе Turbo C++). Базовая программная единица в Turbo C++ представляет собой файл. Обычно такойфайл соответствует файлу DOS, находящемуся в оперативной памяти или на диске и имеющему созданное по правилам DOS имя и расширение .C или . CPP.

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

Пробельные символы

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

int   i; float f;

и

int i ;

float f;

лексически идентичны, а их лексический анализ в обоих случаях дает шесть лексем:

int i ; float f ;

ASCII-символы, обычно рассматриваемые как пробельные, могут входить в строки литералов, и в данном случаебудут защищены от нормального процессаразбиения на лексемыи пробелы; другими словами, они станут представлять собой часть строки:

char name[] = "Borland International";

разбивается на семь лексем, включая и лексему строки литералов "Borland International".

"Склеивание" строк символом \

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

"Borland \

International"

будет рассматриваться как "Borland International" (дополнительную информацию см. на стр. 17 оригинала, "Строковые литералы"

Комментарии

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

Существует два способа указания на комментарии: традиционный метод C и метод C++. Они оба поддерживаются Turbo C+ +, и кроме того, имеется дополнительное, опциональное расширение, позволяющее организовывать вложенные комментарии. Разрешается смешанное и комбинированное использование комментариев любого типа в программах C и C++.

Комментарии C

Традиционный комментарий C представляет собой любую последовательность символов, помещаемую послепары символов/*. Признаком конца комментарияслужитперваяпара символов* /, встретившаяся после исходной пары /*. После выполнения макрорасширения вся эта последовательность целиком, включая четыре разделительных символа комментария,заменяется на один пробел. Отметим, чтонекоторые реализации C удаляют комментарии, не заменяя их на пробелы.

Turbo C++ не поддерживает не-мобильной стратегии вставки лексем с помощью /**/. Вставка лексем в Turbo C++ выполняетсяпри помощи заданной ANSI пары символов ##, следующим образом:

#define VAR(i,j) (i/**/j) /* не будет работать */ #define VAR(i,j) (i##j) /* в Turbo C++ будет работать */

#define VAR(i,j)  (i ## j)   /* также будет работать */

В Turbo C++

int /* объявление */ i /* как счетчика */;

после лексического анализа даст

int  i  ;

то есть три лексемы:  Int I ;

Вложенные комментарии

ANSI C не разрешаетвложенность комментариев. Попытка комментировать приведенную выше строку в виде

/*int /* объявление */ i /как счетчика */; */

окончится неудачей, поскольку область действия первой пары /* будет ограничена первой парой */. Это даст в результате лексического анализа

i ; */

что приведет к генерированию состояния синтаксической ошибки.

По умолчанию Turbo C++ не позволяет вложенность комментариев, однако это умолчание может быть переопределено опцией компилятора. Разрешить вложенность комментариев можно либо при помощи опции -C (компилятора командной строки), либо через меню интегрированной среды программирования O\!C\!Source Options.

Комментарии C++

Для создания вкоде C комментариеввы можете также использовать символы //. Это средство специфично для Turbo C++.

C++ позволяетсоздание размещаемого в одной строке комментария при помощи двух подряд следующихсимволов наклонной черты(//). Такой комментарий может начинаться в любой позиции строки, и включает в себя все, что расположено до символа новой строки:

class X (*  // это комментарий

... *);

Разделители комментариев и пробелы

В редких случаях пробелы перед /* и // или после */, хотя и не являются синтаксически обязательными, нопозволяют избежать проблем, связанных с мобильностью. Например, код C++

int i = j//* деление на k*/k;

+m;

при лексическом анализе дастint i = j +m;  а не

int i = j/k;

+m;

как это можно было бы ожидать по традиционным соглашениям C. Более удобочитаемая форма

int i = j/ /* деление на k*/ k;

+m;

позволяет избежать этой проблемы.

Лексемы

Turbo C++ распознает лексемы шести классов: ключевые слова, идентификаторы, константы, строковые литералы, операции и знаки пунктуации (также называемые разделителями). Формальное описание лексемы имеет следующий вид:

лексема:

ключевое слово

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

константа

строковый литерал

операция

знак пунктуации

Во время лексического анализа исходного кода лексемы выделяются методом, при котором из строки символов обязательно выбирается лексема максимальной длины. Например, слово external будетрассматриваться как отдельный идентификатор, а некак ключевое слово extern, за которым следует идентификатор al.

Ключевые слова

Ключевыми словами называются слова, зарезервированныедля специальных целей, которые не должны использоваться в качестве обычных имен идентификаторов. В следующих двух таблицах приводятся ключевые слова Turbo C++. Вы можете использовать опции компилятора командной строки (или опции в IDE), чтобы выбрать только ключевые словаANSI, ключевые слова UNIX и т.д. Информацию об этих опциях см. в главах 1, "Справочник IDE", и 4, "Компилятор командной строки" в Руководстве пользователя.

Все ключевые слова Turbo C++                              Таблица 1.1

asm   _ds                   interrupt                         short

auto   else                         _loadds                     signed

break   enum                       long                   sizeof

case   _es                     near                    _ss

catch   _export                        new                 static

cdecl   extern                        operator                       struct

char   far                      pascal                      switch

class   float                         private                       template

const   for                      protected                       this

continue   friend                          public                      typedef

_cs   goto                       register                        union

default   huge                          _regparam                      unsigned

delete              if              return                      virtual

do   inline                      _saverages                          void

double             int               _seg                   volatile

while

Расширения Turbo C++ относительно ANSI C                                  Таблица 1.2

cdecl   _export                        _loadds                     _saveregs

_cs   far                     near                    _seg

_ds   huge                      pascal                      _ss

_es   interrupt                          _regparam

Ключевые слова, специфичные для C++                                Таблица 1.3

catch   friend                        operator                       public

class   inline                          private                       template

delete              new             protected                       this

virtual

Регистровые псевдопеременные Turbo C++ Таблица 1.4

_AH _BL

_AL _BP

_AX _BX

_BH _CH

_SP

_CL       _DL

_CX       _DX

_DH       _FLAGS

_DI       _SI

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

Формальное определение идентификатора имеет следующий вид:

идентификатор:

не-цифра

идентификатор не-цифра

идентификатор цифра

не-цифра: одно из

a b c d e f g h i j k l m n o p q r s t u v w x y z _

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

цифра: одно из

0 1 2 3 4 5 6 7 8 9

Ограничения состава и длины идентификаторов

Идентификаторы представляют собой произвольные имена любой длины, присваиваемыеклассам, объектам, функциям,переменным, определяемым пользователем типам данных ит.д. Идентификаторы могут содержать буквы от A до Z и от a до z, символ подчеркивания (_) и цифры от 0 до 9. Существует только два ограничения:

1. Первый символ должен являться буквой или символом подчеркивания.

Отметим, что идентификаторы в Turbo C++ значимы до любой длины.

2. По умолчанию Turbo C++ распознает только первые 32 символа в качестве значимых. Число значимых символов может быть уменьшено при помощи меню или опций командной строки, но не может быть увеличено. Используйте опцию -In TCC, либо опцию меню O\!C\!S\!Identifier Length, где 1 <= n <= 32.

Идентификаторы и учет регистра

Идентификаторы в Turbo C++ учитывают регистр, и таким образом, Sum, sum и suM - это различные идентификаторы.

Глобальные идентификаторы, импортируемые из других модулей, подчиняются тем же правилам наименования и длины значимости имени, что и обычные идентификаторы. Однако, Turbo C ++ включает в себя опциюподавления учета регистра, обеспечивающую совместимость при компоновке с модулями на языках, не учитывающих регистр. Можно отменить учет регистра для глобальных идентификаторов, установив в диалоговом поле Linker в соответствующее состояние поле Options \! Linker \! Case-Sensitive Link,либо использовав опцию командной строки /C при запуске TLINK. В таком режиме глобальные имена Sum и sum рассматриваются как идентичные, и при компоновке может быть выдано предупреждение "Duplicate symbol" ("Повторяющиеся символические имена").

Исключение из этих правил составляютидентификаторы типа pascal, которые при компоновке всегда преобразовываются к верхнему регистру.

Уникальность и контекст идентификаторов

Хотя имена идентификаторов могут быть произвольными (в пределах изложенных правил), в случае использования одного и того же имени для более чем одногоидентификаторав пределах одного контекста и разделении имиодногопространства имен возникает ошибка. Повторение имен в различных пространствах имен допустимо всегда, независимо от контекста. Правила рассматриваютсяпри обсуждении контекста, начиная со стр. 29 оригинала.

Константы

Константами называются лексемы, представляющие собой фиксированные числовые или символьные значения. TurboC++ поддерживает четыре классаконстант: сплавающей точкой, целочисленные, перечислимого типа и символьные.

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

Константы - определение формата  Таблица 1.5

константа:

константа-с-плавающей-точкой

целочисленная-константа

перечислимая-константа

символьная-константа

константа-с-плавающей-точкой:

дробная-константа <экспоненциальная-часть>                                        <суф-

фикс-константы-с-плавающей-точкой>

последовательность-цифр экспоненциальная часть <суффикс-константы-с-плавающей-точкой>

дробная константа:

<последовательность-цифр>.<последовательность-цифр>

<последовательность-цифр>.

экспоненциальная-часть:

e <знак> последовательность-цифр

E <знак> последовательность-цифр

знак: одно из

+ -

последовательность-цифр:

цифра

последовательность-цифр  цифра

суффикс-константы-с-плавающей-точкой: одно из

f l F L

целочисленная-константа:

десятичная-константа <суффикс-целочисленной-константы>

восьмеричная-константа <суффикс-целочисленной-константы>

шестнадцатиричная-константа                               <суффикс-целочислен-

ной-константы>

десятичная-константа:

цифра-кроме-нуля

десятичная-константа  цифра

восьмеричная-константа:

0

восьмеричная-константа  восьмеричная-цифра

шестнадцатиричная-константа:

0 x шестнадцатиричная-цифра

0 X шестнадцатиричная-цифра

шестнадцатиричная-константа  шестнадцатиричная-цифра

цифра-кроме-нуля: одно из

1 2 3 4 5 6 7 8 9

восьмеричная-цифра: одно из

0 1 2 3 4 5 6 7

шестнадцатиричная-цифра: одно из

0 1 2 3 4 5 6 7 8 9

a b c d e f

A B C D E F

суффикс-целочисленной-константы:

суффикс-константы-без-знака  <суффикс-длинной-константы>

суффикс-длинной-константы  <суффикс-константы-без-знака>

суффикс-константы-без-знака: одно из

u U

суффикс-длинной-константы: одно из

l L

перечислимая-константа:

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

символьная-константа:

последовательность-символов-c

последовательность-символов-c:

символ-c

последовательность-символов-c  символ-c

символ-c:

любой символ из исходного набора символов, за исключением символов одинарной кавычки ('), обратной наклонной черты (\) или управляющей-последовательности символа новой строки.

управляющая-последовательность: одно из

\*                \'                      \?                     \\

\a                 \b\f  \n

\o                \oo\ooo  \r

\t                 \v\Xh...  \xh...

Целочисленные константы

Целочисленные константы могут быть десятичными (основание системы счисления 10), восьмеричными (основание 8)или шестнадцатиричными (основание 16). При отсутствии переопределяющих суффиксов типданныхцелочисленной константы выводится из ее значения, как показано в таблице 1.6. Отметим, что правила для десятичных и не-десятичных констант различны.

Десятичные константы

Допустимыми являются десятичные константы величиной от 0 до 4,294,967,295. Константы, выходящие за указанные пределы, вызывают ошибку. Десятичныеконстанты не могут иметь ведущие нули. Целочисленнаяконстанта с ведущим нулем рассматриваетсякак восьмеричная. Таким образом,

int i = 10;   /* десятичное 10 */

int i = 010;  /* десятичное 8 */

int i = 0;  /* десятичное 0 = восьмеричному 0! */

Отрицательные константы- это просто константы без знака, к которым применена унарная операция минус.

Восьмеричные константы

Все константыс ведущим нулем рассматриваются как восьмеричные.Если восьмеричная константа содержит недопустимые цифры 8 или 9, выдается сообщение об ошибке. Ошибка будет также выдаваться при превышении восьмеричной константой значения 037777777777.

Шестнадцатиричные константы

Все константы, начинающиеся с 0x (или 0X) рассматриваются как шестнадцатиричные. Шестнадцатиричные константы,превышающие 0xFFFFFFFF, приводят к ошибке.

Суффиксы длинных констант и констант без знака

Если законстантой следует суффикс L (или l), то такая константа будет представлена как длинная (типа long).Аналогичным образом, суффикс U (или u) делает константу константой без знака (unsigned). Если численное значение константы превышает десятичное 65,535, независимо от используемого основаниясистемы счисления, то такая константа будет иметь тип unsigned long. Суффиксы можно указывать для одной и той же константы в произвольном порядке и набирать в любом регистре: ul, lu, UL и т.д.

Тип данных константы при отсутствии каких-либо суффиксов вообще (U, u, L или l) берется из следующей таблицы,первыйже, который удовлетворяет требованиям величины этой константы:

Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40