Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Состав языка






В тексте на любом естественном языке можно выделить четыре основных элемента: символы, слова, словосочетания и предложения. Подобные элементы содержит и алгоритмический язык, только слова называют лексемами (элементар­ными конструкциями), словосочетания — выражениями, а предложения — операторами. Лексемы образуются из символов, выражения — из лексем и сим­волов, а операторы — из символов, выражений и лексем (рис. 1.1):

- Алфавит языка, или его символы — это основные неделимые знаки, с помощью которых пишутся все тексты на языке.

- Лексема, или элементарная конструкция, — минимальная единица языка, имеющая самостоятельный смысл.

- Выражение задает правило вычисления некоторого значения.

- Оператор задает законченное описание некоторого действия.

Для описания сложного действия требуется последовательность операторов. Операторы могут быть объединены в составной оператор, или блок. В этом случае они рассматриваются как один оператор.

Операторы бывают исполняемые и неисполняемые. Исполняемые операторы задают действия над данными. Неисполняемые операторы служат для описания данных, поэтому их часто называют операторами описания или просто описаниями.

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

Объединенная единым алгоритмом совокупность описаний и операторов образует программу на алгоритмическом языке. Для того чтобы выполнить программу, требуется перевести ее на язык, понятный процессору — в машинные коды. Этот процесс состоит из нескольких этапов. Рисунок 1.2 иллюстрирует эти этапы для языка C++.

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

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

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

Для описания языка в документации часто используется некоторый формальный метаязык, например, формулы Бэкуса—Наура или синтаксические диаграммы. Для наглядности и простоты изложения в этой книге используется широко распространенный неформальный способ описания, при котором необязательные части синтаксических конструкций заключаются в квадратные скобки, текст, который необходимо заменить конкретным значением, пишется по-русски, а выбор одного из нескольких элементов обозначается вертикальной чертой. Например, запись

[ void | int ] имя();

означает, что вместо конструкции имя необходимо указать конкретное имя в соответствии с правилами языка, а перед ним может находиться либо void, либо int, либо ничего. Фигурные скобки используются для группировки элементов, из которых требуется выбрать только один. В тех случаях, когда квадратные скобки являются элементом синтаксиса, это оговаривается особо.

Начнем изучение C++ с самого простого — с алфавита, а затем, осваивая все более сложные элементы, постепенно углубимся в дебри объектно-ориентированного программирования и постараемся в них не заблудиться. К концу изучения этой книги читателю будет легко и приятно порассуждать об «инкапсулированных абстракциях с четким протоколом доступа», о том, отчего нельзя «сгенерировать исключение, если конструктор копии объекта не является общедоступным», и о многих столь же интересных вещах.

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

Алфавит C++ включает:

- прописные и строчные латинские буквы и знак подчеркивания;

- арабские цифры от 0 до 9;

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

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

- пробельные символы: пробел, символы табуляции, символы перехода на но­вую строку.

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

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

- ключевые (зарезервированные) слова;

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

- константы;

- разделители (скобки, точка, запятая, пробельные символы).

Границы лексем определяются другими лексемами, такими, как разделители или знаки операций.

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

Идентификатор — это имя программного объекта. В идентификаторе могут использоваться латинские буквы, цифры и знак подчеркивания. Прописные и строчные буквы различаются, например, sysop, SySoP и SYSOP — три различных имени. Первым символом идентификатора может быть буква или знак подчеркивания, но не цифра. Пробелы внутри имен не допускаются.

СОВЕТ

Для улучшения читаемости программы следует давать объектам осмысленные имена. Су­ществует соглашение о правилах создания имен, называемое венгерской нотацией (по­скольку предложил ее сотрудник компании Microsoft венгр по национальности), по которому каждое слово, составляющее идентификатор, начинается с прописной буквы, а вначале ставится префикс, соответствующий типу величины, например, iMaxLength, lpfnSetFirstDialog. Другая традиция — разделять слова, составляющие имя, знаками под­черкивания: maxjength, number_of_galosh.

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

- идентификатор не должен совпадать с ключевыми словами (см. следующий раздел) и именами используемых стандартных объектов языка;

- не рекомендуется начинать идентификаторы с символа подчеркивания, по­скольку они могут совпасть с именами системных функций или переменных, и, кроме того, это снижает мобильность программы;

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

 

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

Ключевые слова — это зарезервированные идентификаторы, которые имеют специальное значение для компилятора. Их можно использовать только в том смысле, в котором они определены. Список ключевых слов C++ приведен в табл. 1.1.

Таблица 1.1. Список ключевых слов C++

asm else new this
auto enum operator throw
bool explicit private true
break export protected try
case extern public typedef
catch false register typeid
char float reinterpret_cast typename
class for return union
const friend short unsigned
const_cast goto signed using
continue if sizeof virtual
default inline static void
delete int static_cast volatile
do long struct wchar_t
double mutable switch while
dynamic_cast namespace template  

 

Знаки операций

Знак операции — это один или более символов, определяющих действие над операндами. Внутри знака операции пробелы не допускаются. Операции делятся на унарные, бинарные и тернарную по количеству участвующих в них операндов. Один и тот же знак может интерпретироваться по-разному в зависимости от контекста. Все знаки операций за исключением [ ], () и?: представляют собой отдельные лексемы.

Знаки операций C++ описаны в разделе «Операции», а также приведены в приложении 1. Большинство стандартных операций может быть переопределено (перегружено). Перегрузка операций рассмотрена в одноименном разделе.

Константы

Константами называют неизменяемые величины. Различаются целые, вещественные, символьные и строковые константы. Компилятор, выделив константу в качестве лексемы, относит ее к одному из типов по ее внешнему виду.

Форматы констант, соответствующие каждому типу, приведены в табл. 1.2.

Таблица 1.2. Константы в языке C++

Константа Формат Примеры
Целая Десятичный: последовательность десятичных цифр, начинающаяся не с нуля, если это не число нуль   Восьмеричный: нуль, за которым следуют восьмеричные цифры (0, 1, 2, 3, 4, 5, 6, 7) Шестнадцатеричный: Ох или 0Х, за которым следуют шестнадцатеричные цифры (0, l, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F) 8, 0, 199226   01, 020, 07155   ОхА, 0x1 В8, 0X00FF
Вещественная Десятичный: [цифры].[цифры] Экспоненциальный: [цифры][.][цифры]{Е|е}[+|-][цифры] 5.7,.001, 35   0.2Е6,.11е-3, 5Е10
Символьная Один или два символа, заключенных в апострофы 'А', 'ю', '*', 'db', '\0', '\n', '\012', '\x07\x07'
Строковая Последовательность символов, заключенная в кавычки " Здесь был Vasia", " \t Значение r=\0xF5\n"

Допустимые диапазоны значений целых и вещественных констант приведены в табл. 1.4.

Если требуется сформировать отрицательную целую или вещественную константу, то перед константой ставится знак унарной операции изменения знака (-), например: -218, -022, -0хЗС, -4.8, -0.1е4.

Вещественная константа в экспоненциальном формате представляется в виде мантиссы и порядка. Мантисса записывается слева от знака экспоненты (Е или е), порядок — справа от знака. Значение константы определяется как произведение мантиссы и возведенного в указанную в порядке степень числа 10. Обратите вни­мание, что пробелы внутри числа не допускаются, а для отделения целой части от дробной используется не запятая, а точка.

Символьные константы, состоящие из одного символа, занимают в памяти один байт и имеют стандартный тип char. Двухсимвольные константы занимают два байта и имеют тип int, при этом первый символ размещается в байте с меньшим адресом (о типах данных рассказывается в следующем разделе).

Символ обратной косой черты используется для представления:

- кодов, не имеющих графического изображения (например, \а — звуковой сигнал, \n — перевод курсора в начало следующей строки);

- символов апострофа ('), обратной косой черты (\), знака вопроса (?) и кавычки (");

- любого символа с помощью его шестнадцатеричного или восьмеричного кода, например, \073, \0xF5. Числовое значение должно находиться в диапазоне от 0 до 255.

Последовательности символов, начинающиеся с обратной косой черты, называют управляющими, или escape-последовательностями. В таблице 1.3 приведены их допустимые значения. Управляющая последовательность интерпретируется как одиночный символ. Если непосредственно за обратной косой чертой следует символ, не предусмотренный табл. 1.3, результат интерпретации не определен. Если в последовательности цифр встречается недопустимая, она считается концом цифрового кода.

Таблица 1.3. Управляющие последовательности в языке C++

Изображение Шестнадцатеричный код Наименование
  Звуковой сигнал
\b   Возврат на шаг
\f С Перевод страницы (формата)
\n А Перевод строки
\r D Возврат каретки
\t   Горизонтальная табуляция
\v В Вертикальная табуляция
\\ Обратная косая черта
\’   Апостроф
\"   Кавычка
\? 3F Вопросительный знак
\0ddd - Восьмеричный код символа
\0xddd ddd Шестнадцатеричный код символа

Управляющие последовательности могут использоваться и в строковых константах, называемых иначе строковыми литералами. Например, если внутри строки требуется записать кавычку, ее предваряют косой чертой, по которой компиля­тор отличает ее от кавычки, ограничивающей строку:

" Издательский дом \" Питер\" "

Все строковые литералы рассматриваются компилятором как различные объекты.

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

" Никто не доволен своей \

внешностью, но все довольны \

своим умой"

полностью эквивалентна строке

" Никто не доволен своей внешностью, но все довольны своим умом"

В конец каждого строкового литерала компилятором добавляется нулевой символ, представляемый управляющей последовательностью \0. Поэтому длина строки всегда на единицу больше количества символов в ее записи. Таким образом, пустая строка " " имеет длину 1 байт. Обратите внимание на разницу между строкой из одного символа, например, " А", и символьной константой 'А'.

Пустая символьная константа недопустима.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.