Понедельник , 30 марта 2020
Новости
Главная / Студентам / ОАиП / Лекция 2. Лексика языка программированис С++

Лекция 2. Лексика языка программированис С++

2.1 Введение в C и C ++

Язык C разработан Денисом Ричи в начале 80-х г.г. Этот язык создавался как язык системного программирования. Язык C эффективен для разработки операционных систем, компиляторов и т.д., более удобен для написания прикладных программ. Язык поддерживает полный набор конструкций структурного программирования, поддерживает модульность, имеет простую структуру программ. Кроме того, язык C обладает набором низкоуровневых средств, которые позволяют иметь удобный доступ к аппаратным средствам компьютера, в частности, позволяют добраться до каждого бита памяти. алгоритмический программа лексема константа

Преимущества C: переносимость C-программ компьютеры различной архитектуры, из одной операционной системы в другую, лаконичность записи алгоритмов, возможность получить эффективный код программы. Первое описание C приведено в книги Кернигана и Ричи. Имеется стандарт языка C – ANSI. Гибкость и универсальность C обеспечило его широкое распространение.

В начале 80-х г.г. Бьёрн Страуструп расширил C, он создал язык C с классами. В 1983 году это название было заменено на C ++. В 1998 году был создан стандарт языка C ++ — ISO/IEC 14882. Язык C ++ полностью включает возможности языка C, т.е. C – программа свободно реализуется в C ++.

2.2. Базовые средства языка C++

2.2.1 Состав языка

В тексте на любом естественном языке можно выделить четыре основных элемента: символы, слова, словосочетания и предложения.

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

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

Рисунок 1. Состав алгоритмического языка

Для описания сложного действия требуется последовательность операторов. Операторы могут быть объединены в составной оператор, или блок (Блоком в языке С++- считается последовательность операторов, заключенная в фигурные скобки { }). В этом случае они рассматриваются как один оператор. Операторы бывают исполняемые и неисполняемые. Исполняемые операторы задают действия над данными. Неисполняемые операторы служат для описания данных, поэтому их часто называют операторами описания или просто описаниями.

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

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

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

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

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

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

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

Рисунок 1.2. Этапы создания исполняемой программы

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

Например, запись

[ void | int ] имя():

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

2.3 Алфавит языка С (С++)

Алфавит языка С (С++) включает в себя:

  1. Прописные и строчные буквы латинского алфавита и знак подчёркивания
  2. Цифры от 0 до 9
  3.  Специальные знаки: » { } , | [ ] ( ) + — / % * . \ ? < = > ! & # ~ ; ‘ ‘
  4. Пробельные символы: пробел, символы табуляции, символ перехода на следующую строку.

2.3 Лексемы

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

  1. идентификаторы
  2. ключевые (зарезервированные) слова
  3. знаки операций
  4. константы
  5. разделители

Идентификаторы – имя программного объекта. Используются латинские буквы, цифры, знак подчеркивания. Первый символ имени – буква или знак подчеркивания. Пробелов не должно быть, длина имени не ограничивается. В Borland C++ — 1-32 символов. Идентификатор не должен совпадать с ключевыми словами.

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

!!! Все ключевые слова пишутся только строчными буквами.

Примеры некоторых ключевых слов:

asm class inline return
auto double int static
bool do new this
break enum operator try
case friend public typedef

Знаки операций – один или более символов, определяющих действия над операндами.

Знаки операций делятся на:

  • унарные
  • бинарные
  • терарные

Один и тот же знак может интерпретироваться по-разному, в зависимости от контекста.

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

Целая константа может быть записана в 8-, 10-, 16-ричном формате. В 10-ричном формате константы начинаются не с нуля (8, 10, 0, 7, 15 и т.д.). В 8-ричном формате константа начинается с нуля, далее следуют 8-ричные цифры (01, 07, 0701 и т.д.). В 16-ричном формате константа начинается с 0X (0XA, 0X777, 0X1 и т.д.).

Вещественная константа может быть записана в следующем виде:

[цифры].[цифры]
Например: 2.2 или .01 и т.д.
или в экспоненциальной форме
Записывается в виде:
[цифры][.][ цифры]{E|e}[+|-][ цифры]

Примеры записи:
0.2E5
.1e-5
10E5

Символьная константа – один или более символов в апострофах. Примеры:

`A’ `\n’ `\0’ `\0x17’ и др.

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

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

• кодов, не имеющих графического изображения (например, \а — звуковой сигнал, \n — перевод курсора в начало следующей строки);
• символов апострофа ( ‘ ), обратной косой черты ( \ ), знака вопроса ( ? ) и кавычки ( » );
• любого символа с помощью его шестнадцатеричного или восьмеричного кода, например, \073, \0xF5. Числовое значение должно находиться в диапазоне от 0 до 255.

Последовательности символов, начинающиеся с обратной косой черты, называют управляющими, или escape последовательностями.

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

Таблица 1.1 Управляющие последовательности

Запись Код шестнадцатеричный Название
\a 7 Звуковой сигнал
\b 8 Возврат на шаг
\f C Перевод страницы(формата)
\n A Перевод строки
\r D Возврат каретки
\t 9 Горизонтальная табуляция
\v B Вертикальная табуляция
\\ 5C Обратная косая черта
\’ 27 Апостроф
\” 22 Кавычка
\? 3F Знак вопроса
\0ddd Восьмеричный код символа
\0xddd ddd Шестнадцатеричный код символа

Приведенные управляющие константы используются в строковых константах.

Строковые константы – последовательность символов, взятых в кавычки.

Примеры:
“Привет”
 “\n y=%d x=%d”
 “фирма \“Гарант\” ”

Все строковые литералы рассматриваются компилятором как различные объекты. Строковые константы, отделенные в программе только пробельными символами, при компиляции объединяются в одну.

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

Например, строка
«Условие задачи: \
найти сумму положительных чисел, \
делящихся на 2″
полностью эквивалентна строке
«Условие задачи: найти сумму положительных чисел, делящихся на 2»

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

Разница между строкой из одного символа, например, «А», и символьной константой ‘А’ в том, что строка занимает 2 байта, а символьная константа занимает 1 байт.

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

Разделители – пробелы, точки с запятой, фигурные скобки.

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

/*комментарий*/
либо с каждой строки
// комментарий