Реферат: 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
|