Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Давыдов В.Г. - Программирование и основы алгоритмизации - 2003

.pdf
Скачиваний:
839
Добавлен:
13.08.2013
Размер:
9.55 Mб
Скачать

д. Бэкус

Металингвистические

формулы

<Прописная_буква> ::= 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

 

и

их

"

 

 

print

f (

"\п

Программа

 

изображает

 

символы

 

 

printf(

 

 

"коды.

 

\п"

 

) ;

строку

символов

и

нажмите

клавишу "

 

 

 

"\п

Наберите

 

 

 

 

 

 

"Enter.

\п"

) /

Подождать

ввода

 

символа

 

 

ch = getchar(

 

)

;

)

//

 

Enter

 

while

 

(

ch

!=

'\п'

//

 

'\п'

 

вводится

после

нажатия

 

{

 

//

 

Вызов

функции

печати

символа

ch

и

его

десятичного,

 

 

 

 

 

 

 

//

 

 

восьмеричного

 

и

16-ричного

кодов.

Компилятор

 

 

 

//

 

 

контролирует

 

правильность

вызова

функции,

 

 

 

 

//

 

 

используя

 

ее

 

прототип

 

 

 

 

 

 

 

 

 

 

 

convert

 

(

ch

) ;

)

; //

Ввод

следующего

 

символа

 

 

 

 

ch

= getchar(

 

 

 

 

}

 

 

 

"\п

Обработка

 

закончена.

 

\п"

) ;

 

 

 

 

 

printf(

 

 

 

 

 

 

 

 

 

return

 

0;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

//

Определение

 

функции,

 

печатающей

символ

 

и

его

коды

 

39