Главная / Рефераты / Рефераты по информатике, программированию

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


Введение
Документ "Начало работы" содержит обзор всего комплекта документации к Turbo C++. Информация о том, как с наибольшей эффективностью использовать Руководства по Turbo C++, содержится во введении и главе 2 этого документа.
Данное руководство содержит материалы для углубленного изучения программирования и предназначено для тех, кто уже хорошо умеет программировать (на C, либо на другом языке программирования). Здесь содержится справочник по языку C, перекрестные ссылки по библиотеке исполняющей системы и информациЯ по программированию с использованием потоков C++, моделей памяти, плавающей точки, оверлеев, видео-функций, интерфейса с языком ассемблера, а также сообщения об ошибках исполняющей системы и компилятора.
Прочесть документ "Начало работы" следует, если:
1. Вы ранее никогда не программировали ни на одном языке.
2. Вы ранее программировали, но не на C, и желаете прочесть введение в язык C.
3. Вам нужна информация о том, как установить на компьютере Turbo C++.
В Руководстве пользователя находится информация об интегрированной среде Turbo (включая редактор), администраторе управляющей системы, компиляторе командной строки, дополняющих Turbo C++ утилитах и макроязыке редактора Turbo.
Справочник по библиотеке содержит в алфавитном порядке листинг функций и глобальных переменных Turbo C++.
Содержание данного руководства
Глава 1:"Стандарт языка Turbo C++" описывает язык Turbo C++. Здесь приводятся все отличия от стандарта ANSI C. Данная глава также включает справочник по языкам C и C++.
Глава 2: "Перекрестные ссылки по библиотеке управляющей системы" содержит информацию об исходных кодах библиотеки исполняющей системы. Здесь также описаны файлы заголовков и приводятся перекрестные ссылки по библиотеке управляющей системы, организованные по субъектам библиотеки. Например, если вы хотите выяснить, какие функции относятся к графике, вы должны обратиться к разделу данной главы "Графика".
Глава 3:"Потоки C++" рассказывает, как использовать библиотеку потоков C++.
Глава 4:"Модели памяти, операции с плавающей точкой и оверлеи" рассматривает модели памяти, программирование со смешанными моделями памяти, вычисления с плавающей точкой и оверлеями.
Глава 5:"Видео-функции" посвящена обработке в Turbo C++ текстов и графических изображений.
Глава 6:"Интерфейс с языком ассемблера" говорит о том, как нужно писать программы на языке ассемблера, чтобы они правильно работали при вызове из программ на Turbo C++.
Глава 7: "Сообщения об ошибках" перечисляет и объясняет все фатальные ошибки, ошибки и предупреждения исполняющей системы и компилятора, а также дает возможные рекомендации по их устранению.
Приложение А: "Стандарты ANSI, зависимые от реализации" описывает те аспекты стандарта ANSI C, которые были определены с некоторой степенью свободы или не были определены вообще в стандарте ANSI. Следовательно, эти аспекты могут варьироваться в зависимости от конкретной реализации. Данное приложение сообщает о том, как Turbo C++ поступает в отношении каждого из этих аспектов.
Глава 1 Стандарт языка Turbo C++
В данной главе дается подробное справочноеруководство программиста по языку Turbo C++. Оно не является руководством по изучению языка, а скорее формальным описанием языков C и C++ в их реализации программным продуктом Turbo C++. В данной главе описываются грамматические правила записи структуры фраз и лексики языка, а также дается подробное изложение имеющихся директив препроцессора. При формулировке синтаксиса используется модифицированная запись Бэкуса-Науэра,при необходимости сопровождаемая кратким описанием и примерами программ.
Turbo C++ реализует стандарт ANSI C, разработанный техническим комитетом X3J11 между июнем 1983 и декабрем 1988 гг., с некоторыми расширениями, оговариваемыми вданномтексте. Вы имеете возможность устанавливать опции компилятора, которые будут предупреждать вас о том, чтотакие расширения встретилисьпри работе компилятора. Вы можете также настроить компилятор таким образом, чтобы он рассматривал ключевые слова расширений Turbo C++ в качестве нормальных идентификаторов (см. Главу 4,"Компилятор командной строки", в Руководстве пользователя).
Существуют также "согласующие" расширения, включаемые посредством директив #pragma, предлагаемых стандартом ANSI C, предназначенные для работы с нестандартными, зависимыми от конкретной реализации средствами языка.
Turbo C++ является также полной реализацией AT&TC++ версии 2.00, объектно-ориентированного надмножества C, разработанного Бьерном Строструпом из AT&T Bell Laboratories. Помимо того,что C++ дополняет C многими новыми средствами и возможностями, он также и отличен от него в большей или меньшей степени. В настоящей главе содержатся замечания по этим отличиям. Все средства языка Turbo C++,имеющие отклонения от C++, более подробно рассматриваются, начиная со страницы 98.
Синтаксис и терминология
Синтаксические определения состоят из имени определяемого в настоящий момент и не определенного где-либо выше термина, за которым следует двоеточие (:). Альтернативы обычно следуют за этим в отдельных строках, но могут также помещаться и в одной строке; в таком случае им предшествует фраза "одно из". Например,
внешнее-определение:
определение-функции
объявление
восьмеричная цифра: одно из
0 1 2 3 4 5 6 7
Опциональные элементы конструкции заключаются в угловые скобки:
целочисленный-суффикс:
суффикс-целого-без-знака
В данной главеслово "аргумент" везде используется для обозначения действительного значения, передаваемогопри вызове функции. "Параметр" обозначает переменную, определяемую в заголовке функции, которая будет содержать в себе передаваемое значение.
Грамматические правила структуры фраз и лексики языка
Грамматические правила лексикиязыка 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
последовательность-цифр экспоненциальная часть
дробная константа:
.
.
экспоненциальная-часть:
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 bf n
o ooooo r
t vXh... 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) берется из следующей таблицы,первыйже, который удовлетворяет требованиям величины этой константы:
--
десятичная int, long int, unsigned long int
восьмеричная int, unsigned int, long int, unsigned long int
шестнадцатиричная int, unsigned int, long int, unsigned long int
--
Если константа имеет суффикс U или u, то ее тип данных будет первым из типов unsigned int, insigned long int, который удовлетворит требованиям ее величины.
Если константа имеет суффикс L или l, то ее тип данных будет первым из типов long int, unsigned long int, который удовлетворит требованиям ее величины.
Если константа имеет оба суффикса u и l (ul, lu, Ul, lU,uL, Lu, LU или UL), то она будет иметь тип данных unsigned long int.
В таблице 1.6 сведены представления целочисленных констант для всех трех систем счисления. Указанные типы данных предполагают отсутствие переопределяющих суффиксов L или U.
Целочисленные константы Turbo C++ без L или U Таблица 1.6
Десятичные константы
0 до 32,767 int
32,768 до 2,147,483,647 long
2,147,483,648 до 4,294,967,295 unsigned long
> 4294967295 Генерируется ошибка
Восьмеричные константы
00 до 077777 int
0100000 до 0177777 unsigned int
02000000 до 017777777777 long
020000000000 до 037777777777 unsigned long
> 037777777777 Генерируется ошибка
Шестнадцатиричные константы
0x0000 до 0x7FFF int
0x8000 до 0xFFFF unsigned int
0x10000 до 0x7FFFFFFF long
0x80000000 до 0xFFFFFFFF unsigned long
> 0xFFFFFFFF Генерируется ошибка
Символьные константы
Символьная константа - этоодин или более символов, заключенных в одинарные кавычки, например *F*, *=*, *n*. В C константы изодногосимвола имеюттип Int и имеют внутреннее представление16 бит, в то времякак старший байт слова заполняется нулем или знаком. В C++ константа из одного символа имеет тип char. Многосимвольные константы как в C, так и в C ++, имеют тип данных Int.
Управляющие последовательности
Для введения управляющих последовательностей,позволяющих получить визуальное представление некоторых не имеющих графическогоаналога символов, используется символ обратной наклонной черты (). Например, в качестве одного символа новой строки можно записать константу n.
Обратнаянаклонная черта используетсяс восьмеричными или шестнадцатиричными числами для представления ASCII-символами управляющего кода, соответствующемуэтому значению; например, *ишитеваш код следующим образом:
printf("x007" "2.1Простая операционная система");
Неоднозначность может возникнуть также и в случае, когда за восьмеричной управляющей последовательностью следует невосьмеричная цифра. Например, поскольку 8 и 9не являются допустимыми восьмеричными цифрами, константа 258 будет интерпретирована какдвухсимвольнаяконстанта, составленная из символов 25 и 8.
В следующей таблице показаны допустимые управляющие последовательности.
Управляющие последовательности Turbo C++ Таблица 1.7
Последовательность Значение СимволыВыполняемая функция
a b f n r t v 0x07BELЗвуковой сигнал 0x08BSЗабой 0x0CFFПеревод бланка 0x0ALFНовая строка (перевод строки) 0x0DCRВозврат каретки 0x09HTТабуляция (горизонтальная) 0x0BVTВертикальная табуляция 0x5cОбратная наклонная черта
Для фактического представления символа ASCII "обратная наклонная черта", используемого например в команде DOS PATH, следует записывать ее как .
* 0x27 * Одинарная кавычка (апостроф)
" 0x22 " Двойная кавычка
? 0x3F ? Вопросительный знак
OлюбыеO = строка до трех восьмиричных цифр
xH любыеH = строка шестнадцатиричных цифр
XH любыеH = строка шестнадцатиричных цифр
--
Специальные двух-символьные константы Turbo C++
Turbo C++ поддерживает также двух-символьные константы (например, *An*, *nt* и *бъявив, что по умолчанию тип char является unsigned (при помощи опции -R TCC, либо выбором в меню Options ! Compiler ! CodeGeneration опцию Unsigned Characters), чтоприведет к обнулению старшего байта независимо от значения младшего байта.
Широкие символьные константы (только C)
Символьная константа, которой предшествует L, называется широкой символьнойконстантой и имеет тип данных wchar_t (интегральный тип, определяемый в stdef.h). Например,
x = L *AB*;
Константы с плавающей точкой
Константа с плавающей точкой состоит из шести частей:
- десятичное целое
- десятичная точка
- десятичное дробное
- e или E и целочисленная экспонента со знаком (опционально)
- суффикс типа: f или F, либо l или L (опционально)
Десятичное целое или десятичное дробное (но не то и другое) можно опустить. Можно опустить либо десятичную точку, либо букву e (или E) с целочисленной экспонентой со знаком (но не то и другое). Эти правила позволяют выполнять запись чисел как в обычной, так и в научной (экспоненциальной) форме.
Отрицательные константыс плавающей точкой берутся как положительные константы с префиксом - унарной операцией минус (-).
Примеры:
Константа Значение
6
23.45e6 23.45 x 10
.0 0
0. 0
0
1. 1.0 x 10 = 1.0
-1.23 -1.23
-5
2e-5 2.0 x 10
10
3E+10 3.0 x 10
34
.09E34 0.09 x 10
Константы с плавающей точкой - типы данных
При отсутствии каких-либо суффиксов константы с плавающей точкой имеют тип данных double. Однако, вы можете присвоить константе с плавающей точкой тип данных float, добавив к ней суффикс f или F. Аналогичным образом, суффиксl илиL присвоит константе тип данных long double. В следующей таблице показаны диапазоны значений, которые могут принимать типы данных float, double и long double.
Размеры и диапазоны
констант с плавающей точкой Turbo C++ Таблица 1.8
Тип Размер (в битах) Диапазон значений
-38 38
float 32 3.4 x 10 до 3.4 x 10
-308 308
double 64 1.7 x 10 до 1.7 x 10
-4932 4932
long double 80 3.4 x 10 до 1.1 x 10
Перечислимые константы
Перечислимые константы представляют собой идентификаторы, определенные в объявлениях типа enum.Эти идентификаторы обычно выбираются как мнемонические обозначения для удобства обращения с данными. Перечислимые константы имеютцелочисленный тип данных. Они могут быть использованы в любых выражениях, в которых допустим целочисленныйтип данных. Используемые идентификаторы должны быть уникальными в пределах контекста объявления enum.
Значения, принимаемые перечислимыми константами,зависят от формата объявления перечислимого типа и присутствия опциональных инициализаторов. В данном примере,
enum team (* giants, cubs, dodgers *);
giants, cubs и dodgers это перечислимые константы типа team, которые могут быть назначены любым переменным типа team или любой другой переменной целочисленного типа. Значения, принимаемые перечислимыми константами,
giants = 0, cubs = 1, dodgers = 2
при условии отсутствия явных инициализаторов. В следующем примере,
enum team (* giants, cubs=3, dodgers = giants + 1 *);
константы установлены следующим образом:
giants = 0, cubs = 3, dodgers = 1
Значения констант не обязаны быть уникальными:
enum team (* giants, cubs = 1, dodgers = cubs - 1 *);
Допустимы также отрицательные инициализаторы.
Строковые литералы
Строковые литералы, известные также как строковые константы, образуют специальную категорию констант, используемых для работы с фиксированными последовательностями символов. Строковый литерал имееттип данных array ofchar и класспамятиstatic, и записываетсякак последовательность произвольного количества символов, заключенных в двойные кавычки:
"Это строковый литерал!"
Нулевая (пустая) строка записывается как "".
Символы внутри двойных кавычек могут включатьуправляющие последовательности (см. стр. 13 оригинала). Например, данный код,
"tt"Имя "tАдресnn"
распечатается следующим образом:
"Имя " Адрес
Слову "Имя " будет предшествовать два символа табуляции; слову Адрес предшествуетодин символтабуляции. Строка заканчиваетсядвумя символами новой строки. Последовательность " обеспечивает вывод внутренних кавычек.
Строка литерала хранится в памяти как заданная последовательность символов,плюс конечный пустой символ (*см. на рис.1.
Типы данных, размеры и диапазоны значений Таблица 1.9
Тип Размер Диапазон Примеры применения
unsigned char8 0 до 255 Малые числа и полный
набор символов PC
char8 -128 до 127 Самые малые числа и
ASCII-символы
enum 16 -32,768 до 32,767 Упорядоченные наборы
значений
unsigned int 16 0 до 65,535 Большие числа и циклы
short int 16 -32,768 до 32,767 Счетчики, малые числа,
управление циклами
int 16 -32,768 до 32,767 Счетчики, малые числа,
управление циклами
unsigned long 32 0 до 4,294,967,295 Астрономические расстояния
long 32 -2,147,483,648 до 2,147,483,647
Большие числа, население
-38 38
float 32 3.4 x 10 до 3.4 x 10
Научные расчеты (точность
7 разрядов)
-308 308
double 64 1.7 x 10 до 1.7 x 10
Научные расчеты (точность
15 разрядов)
-4932 4932
long double 80 3.4 x 10 до 1.1 x 10
Финансовые расчеты
(точность 19 знаков)
near pointer 16 Не существует Манипулирование адресами
памяти
far pointer 32 Не существует Манипулирование адресами
памяти вне текущего
сегмента

int !s!значение! (дополнение до 2)
15 0
long int !s!значение ! (дополнение до 2)
31 0
-
! !смещенный!мантисса!
float !s!порядок ! !
31 0
--
! ! смещенный ! мантисса !
double !s! порядок ! !
63 0
-
! ! смещенный ! ! мантисса !
long double !s! порядок ! ! !
79 0
s = знаковый бит (0 = положит, 1 = отрицат)
= позиция неявной двоичной точки
1 = целочисленный бит мантиссы: записывается в long double неявно (всегда 1) в float, double
Смещенный порядок (нормализованные значения): float:127 (7FH)
double:1023 (3FFH)
long double: 16,383 (3FFFH)
Рис.1.1 Внутренние представления типов данных
Выражения с константами
Выражение с константами это выражение, вычисление которого даетв результате константу (причем лежащую в диапазоне, определенном для констант данного типа). Вычисление выражений с константами выполняется так же, как и обычных выражений. Выражения с константами можно использовать везде, гдедопускается использование самих констант. Синтаксис выражений сконстантами следующий:
выражение-с-константами:
условное-выражение
Выражения с константами не могут содержать приводимых ниже операций, если эти операции не содержатся в операнде операции sizeof:
- присваивание
- декремент
- вызов функции
- запятая
Описание операций
Операциями называются лексемы, вызывающие некоторые вычисления спеременными ипрочими объектами, указанными в выражении. Turbo C++ имеетособенно богатый набор операций, включающий в себя помимо обычных арифметических и логических операций средства манипуляции с данными на битовом уровне, доступа к компонентам структур иобъединений, а такжеоперации с указателями (установка и обращение по ссылке).
Расширения C++ предлагают дополнительные операции для доступа к компонентам класса и их объектам, атакже механизм перегрузки операций. Перегрузка позволяет переопределять действие любых стандартных операций применительно к объектам заданного класса. В данном разделе мы ограничимся рассмотрением стандартных операций TurboC++. Перегрузка рассматривается, начиная со стр.124 оригинала.
После определения стандартных операций мы обсудим типы данных и объявления, а также объясним, как они влияют на действие каждой операции. Затем мы перейдем к рассмотрению синтаксиса построения выражений с помощью операций, пунктуаторов и объектов.
Операции в Turbo C++ определяются следующим образом:
операция: одно из
[] (). -> ++ --
& * + - тильда !
sizeof / % < >>
> = == != ^
! && !! ?: = *=
/= %= += -= >=
&= ^= != , # ##
Операции # и ## используются только препроцессором (см. стр. 133 оригинала).
Следующие операции являются специфичными для C++:
::.* ->*
За исключением операций [], () и ?:, служащих для записи выражений в скобках, многосимвольные операции рассматриваются в качестве одной лексемы. Лексема одной и той же операции может иметьнесколько интерпретаций, в зависимости от контекста. Например,
A * B Умножение
*ptr Обращение по ссылке
A & B Поразрядное И
&A Операция адресации
int & Модификатор указателя (C++)
label: Метка оператора
a ? x : y Условный оператор
void func(int n); Объявление функции
a = (b+c)*d; Выражение со скобками
a, b, c; Выражение с запятой
func(a, b, c); Вызов функции
a = -b; Поразрядное вычитание (дополнение до
единицы)
-func() (*delete a;*) Деструктор (C++)
Унарные операции
& Операция адресации
* Операция обращения по ссылке
+ Унарный плюс
- Унарный минус
тильда Поразрядное дополнение (дополнение до
единицы)
! Логическое отрицание
++ Префикс: пред- инкремент;
Постфикс: пост- инкремент
-- Префикс: пред- декремент;
Постфикс: пост- декремент
Бинарные операции
Операции типа сложения + Бинарный плюс (сложение)
- Бинарный минус (вычитание)
Операции типа умножения * Умножение
/ Деление
% Остаток от деления
Операции сдвига
>> Сдвиг вправо
Поразрядные операции & Поразрядное И
^ Поразрядное исключающее ИЛИ
! Поразрядное включающее ИЛИ
Логические операции && Логическое И
!! Логическое ИЛИ
Операторы присваивания = Присваивание
*= Присвоить произведение
/= Присвоить частное
%= Присвоить остаток
+= Присвоить сумму
-= Присвоить разность
>= Присвоить сдвиг вправо
&= Присвоить поразрядное И
^= Присвоить поразрядное исключающее
ИЛИ
!= Присвоить поразрядное ИЛИ
Операции отношения < Меньше>
> Больше

>= Больше или равно
Операции равенства == Равно
!= Не равно
Операции выбора. Прямой селектор компонента компонента -> Косвенный селектор компонента
Операции с компонентами :: Доступ/разрешение контекста класса.* Обращение через указатель
к компоненту класса
->* Обращение через указатель
к компоненту класса
Условные операции a ? x : y "Если a то x иначе y"
Операция запятой, Вычислить, например, a, b, c слева - направо
Функции этих операций,также как их синтаксис, приоритет и свойства ассоциативности рассматриваются, начиная со стр. 73 оригинала.
Пунктуаторы
В TurboC++ пунктуаторы, также называемые разделителями, определяются следующим образом:
пунктуатор: одно из
[ ] ( ) (* *), ; :... * = #
Квадратные скобки
[] (открывающая и закрывающая квадратные скобки) указывают на индексы одно- и многомерных массивов:
char ch, str[] = "Stan"
int mat[3][4]; /* матрица 3 x 4 */
ch = str[3]; /* 4-й элемент */
...
Круглые скобки
() (открывающая и закрывающая круглыескобки) группируют выражения, выделяют условные выражения и указывают на вызовы функций и параметры функций:
d = c * (a + b); /* переопределение нормального приоритета */
/* выполнения операций */
if (d == z) ++x; /* важно при использовании условных операций */
func(); /* вызов функции без аргументов */
int (*fptr)(); /* объявление указателя функции */
fptr = func; /* отсутствие () означает указатель функции */
void func2(int n); /* объявление функции с аргументами */
Рекомендуетсяиспользовать круглые скобки в макроопределениях, что позволит избежать возможных проблем с приоритетами операций во время расширения:
#define CUBE(x) ((x) * (x) * (x))
Использование круглых скобок для изменения нормальных приоритетов операцийи правил ассоциативности см. на стр.76 оригинала.
Фигурные скобки
(**) (Открывающие и закрывающие фигурныескобки) обозначают начало и конец составного оператора:
if (d == z)
(*
++x
func();
*)
Закрывающая фигурная скобка служит терминатором составного оператора, поэтому (;) (точка с запятой) после *) не требуется, за исключением структур или объявлений классов. Часто точка с запятой недопустима, как например в случае
if (оператор)
(**); /* недопустимое использование точки с запятой */
else
Запятая
Запятая (,) отделяет элементы списка аргументов функции:
void func(int n, float f, char ch);
Запятая часто используется как операция в "операции с запятой". Обе эти операции являются допустимыми, но для различения их вы должны использовать круглые скобки:
func(i, j); /* вызов функции с двумя аргументами */
func((exp1, exp2), (exp3, exp4, exp5)); /* также вызов функции с двумя аргументами */
Точка с запятой
Точка с запятой (;) служит терминатором оператора. Любое допустимое выражениеС (включая и пустое выражение), за которым следует (;), интерпретируется как оператор, называемый оператором выражения. Выражениевычисляется, а его значение отбрасывается. Если такое выражение не имеетпобочных эффектов, то TurboC++ может его проигнорировать.
a + b; /* a + b вычисляется, но полученное значение теряется */
++a; /* имеется побочный эффект для a, но результат ++a */
/* теряется */
; /* пустое выражение = нулевой оператор */
Точки сзапятой частоиспользуются для создания пустых операторов:
for (i = 0; i < t; i++)>
(*
;
*)
Двоеточие
Двоеточие (:) служит для обозначения оператора с меткой:
stsrt: x=0;
...
goto stsrt;
...
switch (a)(*
case 1: puts("Первый");
break;
case 2: puts("Второй");
break;
...
default: puts("Ни тот, ни другой!");
break;
*)
Метки рассматриваются на стр.92 оригинала.
Многоточие
Многоточие (...) представляет собой три последовательно расположенные точки без пробелов между ними. Многоточия используются в списках формальных аргументовпрототипов функций для обозначения переменногочисла аргументов, либо аргументов с изменяющимся типом:
void func(int n, char ch,...);
Данное объявление указывает, что func будет определена таким образом, что вызовы ее должны содержать как минимум два аргумента, int и char,но также могут иметь и любое число дополнительных аргументов.
В С++ запятую, предшествующую многоточию, можно опустить.
Звездочка (объявление указателя)
Звездочка (*) в объявлении переменной обозначает создание указателя на тип:
char *char_ptr; /* объявление указателя на тип char */
Можно объявить указатели с несколькими уровнями косвенности, что обозначается соответствующим количеством звездочек:
int **int_ptr; /* указатель на указатель на int */
double ***double_ptr /* указатель на указатель на указатель на тип double */
Звездочка также используется в качестве операции обращения через указатель, либо операции умножения:
i = *int_ptr;
a = b * 3.14;
Знак равенства (инициализатор)
Знак равенства (=) разделяет объявления переменных от списков инициализации:
char array[5] = (* 1, 2, 3, 4, 5 *);
int x = 5;
В функциях С никакой код не может предшествовать никаким объявлениям переменных. В С++ объявления любого типа могут находиться (с некоторыми ограничениями) в любой точке внутри кода.
В списке аргументов функции С++ знак равенства указывает на значение параметра по умолчанию:
int f(int i = 0) (*... *) /* параметр i имеет значение по умолчанию ноль */
Знак равенства используется также как операция присвоения в выражениях:
a = b + c;
ptr = farmalloc(sizeof(float)*100);
Знак фунта (директива препроцессора)
Знак фунта (#) означает директиву препроцессора, если она является первым не-пробельным символом встроке. Он задает действие компилятора, не обязательно связанное с генерацией кода. Более подробно директивы препроцессора описаны на стр.133 оригинала.
# и ## (двойной знак фунта) также используются как операции замены и слияния лексем на фазе сканирования кода препроцессором.
Объявления
В данном разделе кратко рассматриваются концепции, связанные с объявлениями: объектов, типов, классов памяти, контекста, видимости, продолжительности и типом компоновки.Преждечем перейти к рассмотрению полного синтаксиса объявления, важно иметь общее представление об этих понятиях.
Контекст, видимость, продолжительность и тип компоновки определяют части программы,из которых могут быть сделаны допустимые ссылки на идентификатор сцельюдоступа к соответствующему объекту. Контекст обсуждаетсяна стр.29 оригинала, видимость - на стр.30; продолжительность рассматривается, начиная со стр. 31, а тип компоновки - на стр.32.
Объекты
Объектом называется идентифицируемая область памяти, которая может содержать фиксированное значение переменной (или набор таких значений). (Используемое в данном случае слово "объект" не следует путать с более общим термином, используемым в объектно-ориентированных языках - см. главу 5, "Введение в С++" в документе "Начало работы".) Каждая величина имеет связанное с ней имя и тип (который также называют типом данных). Имя используется для доступа к объекту. Имя может являться простым идентификатором, либо сложнымвыражением, уникальным образом "указывающим" на данный объект.
Тип используется для
- для определения требуемого количества памяти при ее исходном распределении,
- для интерпретации битовых коды, находимых в объектах при последующих к ним обращениях,
- а также в многочисленных ситуациях контроля типа, требуемого для обнаружения возможных случаев недопустимого присваивания.
Turbo C++ поддерживает многие стандартные (предопределенные), а также определяемые пользователем типы данных, включая целочисленныетипы разных размеров, со знаком и без него, числа с плавающей точкой различной точности представления, структуры, объединения, массивыи классы. Кроме того, имеется возможность устанавливать указатели на большинствоэтих объектов и манипулировать ими со многими моделями памяти.
Стандартные библиотеки Turbo C++, а также ваши собственные программы и файлы заголовковобеспечиваютоднозначные идентификаторы (или выводимые из них выражения) и типы, таким образом, что Turbo C++ можетнепротиворечиво выполнять доступ, интерпретировать и (возможно) изменять битовые коды в памяти, соответствующей каждому активному объекту вашей программы.
Объявления устанавливают необходимыесоотношения распределенияпамятимежду идентификаторами и объектами. Каждое объявление связываетидентификатор с некоторым типом данных. Большинство объявлений, известных как объявления определения, также задает создание (т.е. где и когда) объекта; иначе говоря, распределениефизической памяти и ее возможную инициализацию. Прочие объявления, называемые объявлениями ссылки, просто делают указанные в них идентификаторы известными компилятору. Один и тот же идентификатор может иметь множество объявлений ссылки, особенно в многофайловых программах, однако для каждого идентификатора допустимо только одно объявление определения.
Вообще говоря, идентификатор не может быть правильно использован в программе до соответствующей ему точки объявления в исходном коде. Допустимыми исключениямииз этого правила, известными как ссылки вперед, являютсяметки, структуры, объединения и вызовы необъявленных функций.
Именующие выражения (Lvalues)
Именующее выражение представляет собой локатор объекта, выражение, которое обозначает объект. Примером именующего выражения может служить *P, где P это выражение, дающее непустой указатель. Модифицируемое именующее выражение -это идентифицирующее выражение, относящееся к объекту, к которому возможен доступ и допустимо его изменение в памяти. Указатель константы const, например, не является модифицируемым именующим выражением. Указатель на константуможетбыть изменен (а подлежащее обращению по этому указателю значение - не может).
Исторически в слове Lvalues буква L означает "левый"; это означает, что Lvalue допускается в левой части (апринимающей части) оператора присваивания. Здесь в левой части оператора присваивания допустимы только модифицируемые именующие выражения. Например, если a и b - это не являющиеся константами целочисленные идентификаторы с правильно распределеннымидля них областями памяти, тооба они являются модифицируемыми именующими выражениями, и присваиваниятипа a = 1;и b = a + b; вполне допустимы.
Значения переменной (Rvalues)
Выражение a + b не можетявляться именующим выражением, и выражение типа a + b = a недопустимо, поскольку выражение в левой части не относится кобъекту. Такие выражения часто называют значением переменной (значение правой части выражения).
Типы и классы памяти
Для связи идентификаторов с объектами требуется, чтобы каждый идентификаторимел как минимум два атрибута: класс памяти и тип (иногда его называют типомданных). КомпиляторTurboC++ определяет эти атрибуты появным или неявным объявлениям в исходном коде программы.
Класс памяти задает размещение объекта (сегмент данных, регистр, куча или стек) и продолжительность его времени существования (все время работы программы, либо же при выполнении некоторых конкретных блоков кода). Класспамятиможет быть установлен синтаксисом объявления, расположением в исходном коде или обоими этими факторами.
Тип, как говорилосьвыше,определяет размер памяти, распределяемый объекту, и то, каким образом программа будет интерпретировать битовыекоды, находящиесяв памяти, распределенной объекту. Типданныхможнорассматриватькак множество значений (часто зависимо от реализации), которые может принимать идентификатор данного типа, совокупно с множеством операций, выполнениекоторых допустимо для значений этого типа. Специальная операциявремени компиляции,sizeof, позволяет определить размер в байтах любого стандартного или определяемого пользователемтипа данных; дополнительную информацию об этой операции см. на стр. 81 оригинала.
Контекст
Контекстом идентификатора называется часть программы, в которой данный идентификатор может быть использован для доступа к связанному сним объекту. Существует пять категорий контекста: блок (или локальный), функция, прототип функции, файл и класс (только для С++). Контекст зависит от того, как и где объявлены идентификаторы.
Контекст блока
Контекст идентификатора в случае контекста типаблока (или локального контекста) начинается в точке объявления и заканчивается в конце блока, содержащего данное объявление (такой блокназывается объемлющимблоком). Объявления параметров в определении функции также имеют контекст типа блока и ограничены контекстом блока, где эта функция определена.
Контекст функции
Единственными идентификаторами, имеющими контекст типа функции, являются метки операторов. Именаметок могут быть использованыв операторах goto влюбой точке функции,где объявлена данная метка. Метки объявляютсянеявно; для этого записывается имя_метки: и за ним оператор. Имена меток в пределах функции должны быть уникальными.
Контекст прототипа функции
Идентификаторы, объявленные в списке объявлений
параметров в прототипе функции (не являющиеся частью определения функции) имеют контекст прототипа функции.Конец этого контекста совпадает с концом прототипа функции.
Контекст файла
Идентификаторы с контекстомфайла, называемые часто глобальными, объявляются вне всех блоков и классов; их контекст лежит между точкой объявления и концом исходного файла.
Контекст класса (С++)
Классом можно считать именованный набор компонентов, включая сюда структуры данных и действующие с ними функции. Контекст класса относится, за некоторыми исключениями, к именам компонентов конкретного класса. Классы и ихобъекты имеют множество специальных правил доступа и определения контекста; см. стр. 102 - 113 оригинала.
Контекст и пространства имен
Пространство имен - это контекст, в пределах которого идентификатордолженбыть уникальным. В С существует четыре раздельных класса идентификаторов:
1. Имена меток операторов goto. Эти имена должны быть уникальными в пределах функции, в которой они объявлены.
2. Теги структур, объединений и перечислимых данных. Они должны быть уникальными в пределах блока, в котором они определены. Теги, объявленные вне какой-либо функции, должны быть уникальными относительно всех тегов, определенных вовне.
В С++ структуры, классы и перечислимые данные относятся к одному и тому же пространству имен.
3. Имена компонентовструктур и объединений. Они должны быть уникальными в пределах структуры или блока, в которомони определены. На тип или смещение с одним и тем же именем в различных структурах ограничений не существует.
4. Переменные, определения типа и компоненты перечислимых данных. Они должны бытьуникальными вконтексте, где они определены. Идентификаторы, объявленные внешними, должны быть уникальными среди переменных, объявленных вовне.
Видимость
Видимостью идентификатора называется область исходного кода программы, из которого допустим нормальный доступ к связанному с идентификатором объекту.
Обычно контекст и видимость совпадают, однако бывают случаи, когда объект временно скрыт вследствие наличия идентификатора с тем же именем. Объект при этом не прекращает своего существования, но исходный идентификатор не может служить для доступа к нему до тех пор, пока не закончится контекст дублирующего идентификатора.
Видимость не может выходить за пределы контекста; но контекст может превышать видимость.
...
(*
int i; char ch; // автоматическое распределение по умолчанию
i = 3; // int i и char ch в контексте и видимы
...
(*
double i;
i = 3.0e3; // double i в контексте и видима
// int i в контексте, но скрыта
ch = *A*; // char ch в контексте и видима
*)
// double i вне контекста
i += 1; // int i видима и равна 4
... // char ch все еще в контексте и видима
// и равна *A*
*)
... // int i и char ch вне контекста
И снова, специальные правила действуют в отношение скрытых имен классов и имен компонентов классов: специальные операции С++ позволяют доступ к скрытымидентификаторам при определенных условиях (см. стр.103 оригинала).
Продолжительность
Продолжительность, близко связаннаяс классом памяти, определяет продолжительность периода, в течение которого объявленным идентификаторам соответствуют распределенные в памяти реальные физические объекты. Такжеделается различие между объектами времени компиляции и времени выполнения. Например, переменным, в отличие от определяемых типов (typedefs) и типов, память непосредственно во время выполнения не распределяется. Существует три вида продолжительности: статическая, локальная и динамическая.
Статическая продолжительность (static)
Объекты со статическойпродолжительн...

ВНИМАНИЕ!
Текст просматриваемого вами реферата (доклада, курсовой) урезан на треть (33%)!

Чтобы просматривать этот и другие рефераты полностью, авторизуйтесь  на сайте:

Ваш id: Пароль:

РЕГИСТРАЦИЯ НА САЙТЕ
Простая ссылка на эту работу:
Ссылка для размещения на форуме:
HTML-гиперссылка:



Добавлено: 2011.06.19
Просмотров: 1375

При использовании материалов сайта, активная ссылка на AREA7.RU обязательная!