Давыдов В.Г. - Программирование и основы алгоритмизации - 2003
.pdfд. Бэкус
Металингвистические
формулы
<Прописная_буква> ::= A|B|C|...|Z <Строчная_буква> ::= a|b|c|...|z
-Буква> ::= ( <Прописная_буква> | <Строчная_буква> )
-Ненул_восьм_цифра> 1|2|...|7
-Восьмеричная_цифра> ::= ( <Ненул_восьм_цифра>|0 )
<Ненул__дес_цифра> ::= ( <Ненул_восьм_цифра>|8|9 )
Н. В и р т Синтаксические диаграммы
Прописная_буква Строчная_буква
Буква
^ |
Прописнаябуква |
^ |
^ |
|
|
|
Строчнаябуква |
• — J |
Ненул_восьм_цифра
Восьмеричная_цифра
Ненул1_восьм _цифра
I
Ненул_дес_цифра
X
Ненул_восьм _цифра
<Десятичная_цифра> :;= |
|
|
Десятичная_цифра |
||
( <Ненул^ес_цифра>|0 ) |
|
|
|||
|
|
|
|
||
|
|
|
|
|
Ненул_дес_ |
|
|
|
|
|
цифра |
|
|
|
|
|
I |
<Идентификатор> ::= ( <Буква>|_ ) |
Идентификатор |
||||
{ ( <Буква>| |
|
|
|
|
|
|
<Десятичная_цифра>|_)} |
|
Буква |
Буква |
|
|
|
|
|
||
!!! |
ДЛИНАИДЕнтификатора |
!!! |
|
Дес цифра |
|
|
Эквивалентно |
|
|
|
о- |
|
|
|
|
|
|
Ж |
ДЛИНАИДЕ |
8! |
> К . |
|
|
Рис. 1 1. Способы описания синтаксиса языка
Семантика определяет смысл предложений (операторов), за писанных на языке, как каждого в отдельности, так и их совокупно сти. В большинстве случаев смысл предложений будет представ-
30
ляться некоторыми пояснениями на обычном языке или эквивалент ными совокупностями других предложений языков Си/С++.
2.3. Структура и конструкция программы на Си/С++
Базовыми элементами языков Си/С++ являются:
•комментарии;
•идентификаторы;
.• служебные (зарезервированные) слова;
•константы;
•операторы;
•разделители.
Из базовых элементов строится программа. Рассмотрим снача ла базовые элементы, а затем и структуру программы.
2.3.1. Комментарии
Синтаксическая диаграмма комментария к фрагменту Сипрограммы приведена на рис. 12.
Комментарий
>Ci*
Печатный символ
Рис. 12. Определение комментария в языке Си
В Си-программе комментарии используются для документиро вания и могут начинаться и заканчиваться в любом месте програм мы, где может находиться символ "пробел", и могут содержать лю бое количество строк:
/'*' Это однострочный комментарий */
/-^
Компилятор |
языка Си рассматривает |
эти |
строки как |
комментарий |
|
"-/
Обратите внимание, что вложенные комментарии наподобие показанного ниже не допускаются стандартом ANSI и большинст вом компиляторов:
31
Эта |
часть |
комментария |
правильная |
*/ |
||
/'*• Начало |
этого |
комментария |
игнорируется. |
|||
Эта |
строка |
теперь |
находится |
вне комментария! |
Ошибка! |
Этот пример показывает, что внутренняя пара символов "/*" игнорируется, а первая же пара символов "*/" завершит коммента рий. Тем самым, предпоследняя строка и последняя пара символов "*/" окажутся вне комментария и при попытке их компиляции будет выдано сообщение об ошибке.
Наряду с рассмотренными вариантами в языке C++ имеется и другая форма записи комментария:
/ / Это однострочный комментарий
Комментарии подобного вида удобно использовать как ло кальные комментарии для пояснений к определению некоторого объекта или пояснений к отдельному оператору.
/* |
Коммен- |
// |
Такое |
вложение возможно! -тарий */ |
// |
Коммен- |
/* |
И так |
тоже можно! */ -тарий |
Двусмысленность!
X = Y//* Это деление */Z;
Надо так:
X = Y/ /->" Это деление ^/ Z;
2.3.2. Идентификаторы
Идентификаторы были рассмотрены выше (см. рис. 11). Иден тификатор представляет собой имя некоторого объекта программы. Подробнее об объектах программы говорится ниже в разд. 3.
2.3.3. Служебные слова
Служебные слова представляют собой идентификаторы, имею щие специальное значение для компиляторов языков Си/С++. Их нельзя использовать как имя переменной. Ниже приведен список служебных слов языка C++:
asm |
|
auto |
|
bool |
break |
case |
|
catch |
|
char |
class |
const |
|
const |
cast |
continue |
default |
delete |
cast |
do |
|
double |
explicit |
dynamic |
else |
|
enum |
32
export |
extern |
false |
float |
|
|
for |
friend |
goto |
if |
|
|
Inline |
int |
long |
xmitable |
|
|
namespa.ce |
new |
operator |
private |
|
|
protected |
public |
register |
reinterpret^cast |
||
return |
short |
signed |
sizeof |
|
|
static |
static_cast |
struct |
switch |
|
|
template |
this |
throw |
true |
|
|
try |
typedef |
typeid |
typename |
|
|
vmion |
unsigned |
using |
virtual |
|
|
void. |
volatile |
wchar t |
while |
|
|
Трансляторы языков |
Cu/C++, соответствующие |
требованиям |
|||
стандарта ANSI, |
воспринимают только |
слуэюебные |
слова, |
записан |
|
ные строчными |
буквами. |
Функции служебных слов будут |
рассмат |
риваться ниже по мере изучения материала.
Напоминаем, что не следует использовать имена объектов (идентификаторы), совпадающие со служебными словами.
2.3.4. Константы
Определение константы с помощью синтаксической диаграм мы приведено на рис. 13.
Константы
|
Целая_костанта |
|
#i Символьная константа |
|
Строковая_константа |
|
Константа с пл. точкой |
|
Рис. 13. Определение константы |
Константы, |
в отличие от переменных, являются фиксирован |
ными значениями^ |
которые можно вводить и использовать на языках |
Си/С++. |
|
Целые константы. Целые константы (рис. 14) не имеют дробной части и не содержат десятичной точки. В отличие от кон стант с плавающей точкой они точно представляют изображаемое значение. Наиболее часто используются десятичные константы. Шестнадцатеричные и восьмеричные константы полезны, когда прихо-
33
дится иметь дело с данными, представляющими комбинации битов (получаются более короткие записи). Определение десятичной, восьмеричной и шестнадцатеричной констант приведено на рис. 15 - 17.
Целые константы могут быть обычной длины или длинные. Длинные целые константы оканчиваются буквой "/" или "L"
Размер целых констант обычной длины зависит от реализации, (для шестнадцатиразрядного процессора — 2, для тридцатидвухраз рядного — 4 байта). Длинная целая константа всегда занимает 4 бай та. Таким образом, на тридцатидвухразрядном процессоре эквива лентны длинная целая константа и целая константа обычной длины.
Целая_константа
Десятичная_константа
Восьмер._константа
#J Шестнад._константа —••
Рис. 14. Определение целой константы
Десятичная_константа
Ненул ._десят._цифра
Десятичная_цифра
11 -1028 57944L
Рис. 15. Определение десятичной константы
Восьмеричная_константа
ч2>-
Восьм._цифра
013 02000 0160000L
Рис. 16. Определение восьмеричной константы
34
Шестнадцатеричная_константа |
|
||
М о |
\ |
^ |
Шестнадцатерич- |
) |
^ |
ная_цифра |
|
|
] — |
• |
щ |
Шестнадцатеричная цифра |
0X400 |
|
ОхЬ |
|
OxEOOL |
Десят._цифра
Рис. 17. Определение шестнадцатеричной константы
Внутреннее представление константы целого типа в ЭВМ — целое число в двоичном коде. При использовании десятичной целой константы старший бит числа интерпретируется как знаковый (О — положительное число, 1 — отрицательное). Для восьмеричных и шестнадцатеричных целых констант возможно представление только положительных чисел и нуля, поскольку старший разряд рассматри вается как часть кода числа, а не как его знак. Более подробное об суждение внутреннего представления в ЭВМ целых констант выхо дит за рамки данной книги и будет рассмотрено при изучении арифметических основ построения ЭВМ.
Диапазон значений десятичных констант обычной длины для шестнадцатиразрядного процессора - от -32768 до +32767, для три-
дцатидвухразрядного процессора - ^ ^ ...-г^^ i;; Диапазон значе ний восьмеричных и шестнадцатеричных констант обычной длины для шестнадцатиразрядного процессора - 0...(2'^-1), для тридцатид вухразрядного процессора - 0...(2^2 _])
Диапазон значений длинных десятичных констант не зависит
от разрядности процессора и составляет ^""-^ •+(2 -1)) Диапазон значений длинных восьмеричных и шестнадцатеричных констант также не зависит от разрядности процессора и составляет 0...(232 _])
Константы с плавающей точкой. Определение константы с плавающей точкой приведено на рис. 18. Внутреннее представление в ЭВМ констант с плавающей точкой состоит из двух частей — ман тиссы и порядка. При этом константы с плавающей точкой типа float занимают 4 байта, из которых один двоичный разряд отводится под знак мантиссы, 8 разрядов под порядок и 23 под мантиссу. Ман тисса - число большее 1,0, но меньшее 2,0. Поскольку старшая циф-
35
pa мантиссы всегда равна 1, то она не хранится. Для констант с пла вающей точкой типа double, занимающих 8 байт, под порядок и мантиссу отводятся соответственно 11 и 52 разряда. Длина мантис сы определяет точность числа, а длина порядка — диапазон числа. Для констант с плавающей точкой типа long double под число отво дится 10 байт. Также заметим, что более подробное обсуждение внутреннего представления fe ЭВМ констант с плавающей точкой выходит за рамки данной книги и будет рассмотрено при изучении арифметических основ построения ЭВМ.
В языке C++, когда в конце константы с плавающей точкой от
сутствуют б у к в ы / F, /, L, константа имеет тип double |
(8 байтов |
или |
|||||
64 бита с диапазоном значений |
±l,7•10~^°^..±l,7 •Ю^'*^^). Если |
же |
кон |
||||
станта заканчивается буквой/или F, то она имеет тип float, |
занима |
||||||
ет 4 байта и диапазон значений |
±3,4•10'^^..±3,4•10^^^. |
Аналогичным |
|||||
образом, при завершении константы буквами / или L константа име |
|||||||
ет тип |
long |
double, занимает |
10 |
байт с диапазоном |
значений |
||
Константа_с_плавающей_точкой |
|
|
|
|
|
||
|
|
F-константа |
|
|
|
||
•СУ |
F-константа |
|
F-константа |
|
|
|
|
|
|
|
|
|
|
||
е |
H h |
F-константа |
|
|
|
|
|
|
|
10. |
|
Ю.Гэкв. 10.F |
|
|
|
|
|
0.0054 |
0/00541 экв. 0.0054L |
|
|
|
|
|
|
.0054 |
|
|
|
|
|
F-константа |
5.5е-3 |
|
|
|
|
<7>
- • Десятичная_константа
Рис. 18. Определение константы с плавающей точкой
36
Символьные константы. Для кодирования одного символа используется байт (восемь битов). Благодаря этому набор символов содержит 256 символов, образующих две группы:
•печатные символы;
•непечатные символы.
Непечатным символам соответствуют специальные управляю щие коды, которые служат для управления внешними устройствами или для других видов управления. В качестве примера непечатного символа назовем символ перехода к новой странице, управляющий, например, работой принтера.
Символьная константа в языках Си/С+-ь состоит либо из одно го печатного символа, заключенного в апострофы, либо управляю щего кода, заключенного в апострофы. Управляющие коды пред ставляют непечатные символы (табл. 5). Символьная константа рас сматривается как символьный беззнаковый тип данных с диапазо
ном значений от О до 255. Константа '\0' называется |
нулевым |
сим |
|
волом или нулевым байтом. |
|
|
|
Примеры: 'д:' ' Г Лп' |
|
|
|
Табл. 5. Управляющие символы (коды) |
|
|
|
Управляющий код |
Назначение |
|
|
\п |
Переход к новой строке |
|
|
V |
Возврат каретки |
|
|
\/ |
Горизонтальная табуляция |
|
|
\v |
Вертикальная табуляция |
|
|
\b |
Возврат на одну позицию |
|
|
Y |
Переход к новой странице |
|
|
\\ |
Обратная косая черта |
|
|
\» |
Кавычка |
|
|
\' |
Апостроф |
|
|
\шестнадцатеричная_константа или |
|
|
|
\восьмеричная_константа |
|
|
|
Строковые константы. |
Строковая константа |
содержит |
по |
следовательность из нуля или более символов, заключенную в ка вычки. Для запоминания строковых констант используется по одно му байту на каждый символ строки и автоматически добавляется к ней признак конца строки, которым служит нулевой байт. Нулевой байт является ограничителем строки.
Для составления строковых констант можно использовать лю
бые печатные символы или управляющие коды, перечисленные |
выгие. |
На рис. 19 показан пример размещения строки в оперативной |
памя |
ти ЭВМ. |
|
Приведем еще несколько примеров строковых констант: |
|
37
"Эта строка содержит символ табуляции |
\ t " |
|
|
"В строке указан символ,, вызывающий |
звуковой |
сигнал: |
\07' |
Последняя строка пустая, в ней нет ни одного символа, однако для ее хранения используется один байт - завершающий нулевой байт.
"СтрокаЛп" |
|
С т Р о к а |
\п \0 Байты памяти, содержащие коды от |
|
О до 255 |
|
Нулевой |
|
байт |
Рис. 19. Размещение строки в оперативной памяти
2.3.5. Структура Си-программы
Си-программа - совокупность одного или нескольких модулей. Модулем является самостоятельно транслируемый файл. Такой файл обычно содержит одну или несколько функций. Функция состоит из операторов языка Си. Структуру Си-программы иллюстрирует рис. 20.
Си-программа
Модуль (файл с определениями данных и операторами) Внешние определения данных
Функция Внутренние определения данных
Операторы
Функция Внутренние определения данных
Операторы
Модуль (файл с определениями данных и операторами) Внешние определения данных
Функция Внутренние определения данных
Операторы
Функция Внутренние определения данных
Операторы
Рис. 20. Структура Си-программы
38
Термин "функция" в языках Си/С+-*- охватывает понятия "под программа", "процедура" и "функция", используемые в других язы ках программирования. Как следует из рис. 20, Си/С++-программа может содержать одну функцию (главная функция main) или любое количество функций. Выполнение программы начинается с главной функции. Приведем простой пример подобной программы.
ми. |
Си++. |
|
Программа |
с |
одним |
модулем |
|
(файлом) |
и |
двумя |
функция |
|||||||||||||
Чтение |
с |
клавиатуры |
|
одной |
строки |
символов, |
|
заканчивающей |
||||||||||||||||
ся |
символом |
'\п |
' . |
Каждый |
символ |
печатается |
вместе |
с его |
деся |
|||||||||||||||
тичным, |
восьмеричным |
и |
шестнадцатеричным |
|
кодами |
|
|
|||||||||||||||||
V |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
^include |
|
<stdio.h> |
|
|
|
// |
|
Для |
функций |
|
ввода-вывода |
|
||||||||||||
// |
В результате |
выполненмя |
|
директивы |
|
включения |
на |
место |
|
|||||||||||||||
// |
|
предыдущей |
строки |
|
помещается |
содержимое |
файла |
stdio.h |
||||||||||||||||
// |
Прототип |
функции: |
используется |
компилятором |
для |
проверки |
||||||||||||||||||
// |
|
правильности |
|
записи |
|
заголовка |
|
в |
определении |
функции |
и |
|||||||||||||
// |
|
правильности |
|
вызова |
|
функции |
|
|
|
|
|
|
|
|
||||||||||
void |
convert( |
|
±nt |
) |
; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
// |
Выполнение |
программы |
начинается |
с |
выполнения |
следующей |
||||||||||||||||||
// |
|
ниже |
главной |
|
функции |
Возвращает |
|
О при |
|
успехе |
|
|
||||||||||||
int |
main |
( |
void |
|
) |
|
|
|
/ / |
|
|
|
|
|
||||||||||
{ |
±пЬ |
|
|
|
ch; |
|
|
|
// Прочитанный |
символ |
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
аргументами |
||||||||||||||||
|
// |
На экран |
выводятся |
|
две |
строки, |
являющееся |
|
||||||||||||||||
|
// |
|
|
функции |
экранного |
|
вывода |
|
printf |
|
и |
их |
" |
|
||||||||||
|
f ( |
"\п |
Программа |
|
изображает |
|
символы |
|
||||||||||||||||
|
printf( |
|
|
"коды. |
|
\п" |
|
) ; |
строку |
символов |
и |
нажмите |
клавишу " |
|||||||||||
|
|
|
"\п |
Наберите |
|
|||||||||||||||||||
|
|
|
|
|
"Enter. |
\п" |
) / |
Подождать |
ввода |
|
символа |
|
||||||||||||
|
ch = getchar( |
|
) |
; |
) |
// |
|
Enter |
||||||||||||||||
|
while |
|
( |
ch |
!= |
'\п' |
// |
|
'\п' |
|
вводится |
после |
нажатия |
|||||||||||
|
{ |
|
// |
|
Вызов |
функции |
печати |
символа |
ch |
и |
его |
десятичного, |
||||||||||||
|
|
|
|
|||||||||||||||||||||
|
|
|
// |
|
|
восьмеричного |
|
и |
16-ричного |
кодов. |
Компилятор |
|||||||||||||
|
|
|
// |
|
|
контролирует |
|
правильность |
вызова |
функции, |
|
|||||||||||||
|
|
|
// |
|
|
используя |
|
ее |
|
прототип |
|
|
|
|
|
|
|
|
||||||
|
|
|
convert |
|
( |
ch |
) ; |
) |
; // |
Ввод |
следующего |
|
символа |
|
||||||||||
|
|
|
ch |
= getchar( |
|
|
|
|||||||||||||||||
|
} |
|
|
|
"\п |
Обработка |
|
закончена. |
|
\п" |
) ; |
|
|
|
|
|||||||||
|
printf( |
|
|
|
|
|
|
|
|
|||||||||||||||
|
return |
|
0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
// |
Определение |
|
функции, |
|
печатающей |
символ |
|
и |
его |
коды |
|
39