ebook img

C++. Бархатный путь PDF

401 Pages·2005·41.886 MB·Russian
Save to my drive
Quick download
Download
Most books are stored in the elastic cloud where traffic is expensive. For this reason, we have a limit on daily download.

Preview C++. Бархатный путь

А. Л. Марченко БАРХАТНЫЙ ПУТЬ Москва Горячая линия - Телеком 2005 УДК 681.3 МЗО ББК 32.97 Марченко А. Л. МЗО C++. Бархатный путь. - 2-е изд., стереотип. - М.: Горячая линия- Телеком, 2005. - 399 с: ил. ISBN 5-93517-056-6. Основная задача книги - обеспечить плавный, «бархатный» переход от интуитивного уровня представления о языке программирования C++ к чет- ким и достоверным знаниям о нем, о его синтаксисе и семантике. Подробно обсуждаются причины и следствия введения различных языковых конструк- ций, специально подобранные примеры позволяют акцентировать внимание на характерных особенностях языка. Книга может быть использована как в качестве учебного пособия, так и качестве справочника по языку C++. Для программистов, может быть полезна студентам и аспирантам соот- ветствующих специальностей. Адрес издательства в Интернет www.techbook.ru e-mail: [email protected] Справочное издание Марченко Антон Леонардович C++. Бархатный путь Редактор И. Н. Карпенко Художник В. Г. Ситников Подготовка оригинал-макета Н. К. Савина Лицензия ЛР № 071825 от 16.03.99 г. Подписано к печати 02.08.2005. Формат 60x90 1/16. Усл. печ. л. 18,2. Изд. № 56. Тираж 1000 экз. ISBN 5-93517-056-6 © А. Л. Марченко, 1999, 2005 © Оформление издательства «Горячая линия-Телеком», 2005 Предисловие В одном энциклопедическом словаре по поводу того, что такое язык, сказано буквально следующее: "ЯЗЫК, 1) естественный язык, важнейшее средство человеческого общения. Я. нераз- рывно связан с мышлением; является социальным средством хранения и передачи информа- ции, одним из средств управления человеческим поведением. Я. возник одновременно с возник- новением общества в процессе совместной трудовой деятельности первобытных людей. Воз- никновение членораздельной речи явилось мощным средством дальнейшего развития челове- ка, общества и сознания. Реализуется и существует в речи. Я. мира различаются строением, словарным составом и др., однако всем Я. присущи некоторые общие закономерности, систем- ная организация единиц языка (например, парадигматические и синтагматические отношения между ними) и др. Я. изменяется во времени (см. Диахрония), может перестать использоваться в сфере общения (мёртвые Я.). Разновидности Я. (нац. Я., лит. Я., диалекты, Я. культа и др.) играют различную роль в жизни общества. 2) Любая знаковая система, напр. Я. математики, кино, Я. жестов. См. также Искусственные языки, Язык программирования. 3)..." C++ также является языком. Его так и называют "язык программиро- вания C++". Это формальный язык. Он служит для описания данных и ал- горитмов их обработки на ЭВМ. Несмотря на огромную разницу между естественными и формаль- ными языками, у них есть много общего. Их общие черты неожиданно про- являются в самых разных областях. Например, изучение естественного языка является сложным про- цессом, включающим как обретение элементарных автоматических навы- ков, так и восприятие сложных абстрактных понятий. При этом возмож- ность относительно свободного использования языка как средства обще- ния появляется уже на ранних стадиях этого процесса, когда вообще ещё не имеет смысла говорить о знании языка. Так, подавляющее большинство населения любого крупного города общается между собой, используя раз- говорный язык той страны или той местности, в которой расположен этот город. Практически все, кто проживает в городе, свободно владеет разго- ворным языком, а вернее, навыками разговорной речи. При этом лишь не- значительная часть жителей действительно знает этот язык. Аналогичная ситуация наблюдается и с языками программирования. Первые опыты программирования, подобно использованию навыков разго- ворной речи, не требуют особых познаний в области формальных языков. Для написания хороших работающих программ не обязательно знать о языке программирования всё. На основе интуитивных представлений об алгоритмах и устройстве компьютера, после анализа нескольких работаю- щих программ или даже фрагментов одной программы, в буквальном смысле по образцам, можно успешно описывать собственные алгоритмы. Однако, грамотная речь всё же невозможна без знания языка, а профессиональное программирование с использованием современных технологий требует глубоких знаний в области языков программирования. Книга "C++. Бархатный путь" адресована, прежде всего, тем, кто уже имеет навыки в области программирования, кто уже знает, что такое ком- пьютер, алгоритм, редактор и транслятор, кто, возможно, уже наблюдал появление на экране дисплея волнующей надписи "Hello, world!" — уча- щимся старших классов и студентам младших курсов. Однако подобная адресация условна, поскольку учиться, как известно, никогда не бывает поздно. Книга состоит из девяти разделов, в которых сгруппирован матери- ал, позволяющий на основе базовых языковых конструкций и элементар- ных понятий описывать всё более сложные элементы языка C++ и связан- ные с ними концепции: алфавит и идентификаторы элементарные типы, объявления и определения операции, выражения и операторы функции и их характеристики новые типы и средства их построения конструкторы, деструкторы, функции-члены и операторные функции механизмы наследования, инкапсуляции и полиморфизма шаблоны потоки ввода-вывода средства обработки исключительных ситуаций. В книгу также включено несколько приложений: грамматика языка C++; информация о контроле типов, типизации и прочих важных характеристиках языков программирования; • сведения об алгоритмах преобразования, дополнительном коде и о преобразо- вании дробной части вещественного числа. Эти приложения включены в книгу с единственной целью: чтобы при обсуждении того, ЧТО ДЕЛАЕТСЯ, не возника- ло вопросой по поводу того, КАК ЭТО ДЕЛАЕТСЯ; • элементы теории комплексных чисел. Комплексные числа — наш полигон. Мно- гие конструкции языка C++ мы в дальнейшем будем отрабатывать примени- тельно к множеству комплексных чисел. "Бархатный путь" не является учебником по программированию и поэтому в этой книге нет полезных советов, которые позволяли бы с по- мощью обсуждаемых языковых конструкций решать конкретные приклад- ные задачи. Большинство приводимых здесь примеров, на первый взгляд, кажутся бесполезными и даже бессмысленными. Однако выбор этих при- меров далеко не случаен. Дело в том, что C++ является языком "общения" человека с компью- тером. Основным "читателем" текстов на языке C++ является транслятор. Это особая программа, в обязанности которой входит проверка правильно- сти текста программы и его последующий перевод на язык процессора — основного устройства ЭВМ, который и обеспечивает выполнение програм- мы. У процессора свой взгляд на программу. Он не имеет никакого пред- ставления о содержательной стороне описываемых алгоритмов. Процес- сору важны адреса, регистры, прерывания. Язык программирования позволяет описывать алгоритмы и данные, но его выразительные возможности не исчерпываются множеством содержательных алгоритмов и связанных с ними структур данных. Даже самые абсурдные с точки зрения программиста предложения языка остаются абсолютно правильными и корректными для транслятора. Примеры, основанные на содержательных алгоритмах, неизбежно оставляют за рамками изложения множества предложений, на которых, порой, и выявляются характерные черты языка. Несколько слов о названии книги. Понятие бархатного пути связано с железной дорогой. Бархатный путь — это высокое качество железнодо- рожного полотна и мастерство вождения локомотива. Бархатный путь предполагает мягкое взятие состава с места, его плавный разгон и веде- ние поезда без толчков, качки, лязга и скрежета. Путешествие по железной дороге — не самый лучший способ знакомства с местностью, по которой проложена эта дорога. Из окна вагона можно не заметить даже очень кру- того поворота пути, а узкая полоска защитных насаждений вдоль железно- дорожных путей порой кажется густым лесом. Проезжая через населённые пункты, часто удаётся разглядеть лишь заборы и привокзальные построй- ки. Так и страницы книги о языке программирования — не самое лучшее место для описания алгоритмов. И все же поездка по железной дороге на дрезине, вне расписания, с остановками у переездов и мостов, стрелок, семафоров, поворотных кру- гов, горок и замздлителей является лучшим способом ознакомиться с уст- ройством дороги. Такое путешествие — прекрасная возможность всё рас- смотреть, потрогать и покрутить. При работе над книгой для большинства примеров использовался компилятор, входящий в состав интегрированной среды разработки при- ложений Borland C++ 4.5. Его следует воспринимать исключительно как простое средство передвижения по "бархатному пути" — своего рода hand car. Выбор транслятора для примеров в этой книги абсолютно не принци- пиален. Следует лишь иметь в виду, что их выполнение в других инстру- ментальных средах может привести к иным результатам. Это связано с тем, что многие свойства языка C++ (размеры данных основных типов, способы их размещения в различных сегментах памяти и т.д.) зависят от конкретной реализации языка. Впрочем, это нисколько не противоречит тому, о чём говорится в книге. Везде, где это необходимо, в тексте содер- жатся соответствующие предупреждения. C++ — это сложный, логически стройный и красивый язык. Его хо- рошее знание приводит к мастерскому владению этим языком. И здесь уже будет по силам решение любой задачи. Выражаю свою благодарность кафедре сейсмометрии и геоакустики Геологического факультета МГУ и Лицею информационных технологий за предоставленную возможность работы над книгой. Замечания и комментарии моих слушателей и студентов были чрезвычайно полезны. Я благодарю преполавателей Высшей компьютерной школы при МГУ, чьи великолепные курсы леЩий оказали большое влияние на мою работу. Особую благодарность выражаю Центру информационных технологий. Я признателен В.А. Гиглавому, Е.А. Зуеву, С.Д. Кузнецову, А.А.Черкасову за поддержку, внимание, советы и внесенные в мою рукопись исправления. Больщое спасибо всем, чья критика позволила мне устранить ошибки и недочеты в ходе работы над книгой. Введение Язык и грамматика Формальный язык является объединением нескольких множеств: • множества исходных символов, называемых литерами (алфавит); • множества правил, которые позволяют строить из букв алфавита но- вые слова (правила порождения слов или идентификаторов); • множества предопределённых идентификаторов или словаря ключе- вых слов; • множества правил, которые позволяют собирать из слов языка выра- жения, на основе которых строятся простые и сложные предложения (правила порождения операторов или предложений). Множество правил порождения слов, выражений и предложений на- зывают грамматикой формального языка или формальной грамматикой. У формального языка много общего с естественным, предложения которого также строятся в соответствии с грамматическими правилами. Однако грамматика естественного языка, подобно наукам о природе, с известной степенью достоверности описывает и обобщает результаты наблюдений за естественным языком как за явлением окружающего мира. Характерные для грамматики естественных языков исключения из правил свидетельствуют о том, что зафиксированная в грамматике языка система правил не может в точности описать все закономерности развития языка. Формальные языки проще естественных языков. Они создаются од- новременно с системой правил построения слов и предложений. Исключе- ния из правил в формальном языке могут свидетельствовать лишь о про- тиворечивости и некорректности системы грамматических правил. Однако и здесь не всё так просто. В языке программирования C++ существуют так называемые дополнительные специальные правила соот- несения (соотнесения имени и его области действия - скоро мы встретим- ся с этими правилами). Так вот эти правила (а, может быть, соглашения?) вполне можно рассматривать как аналоги исключений, поскольку они ди- рективно (по соглашению) отдают предпочтение одной из возможных аль- тернатив. Грамматические правила можно записывать различными способа- ми. Грамматика естественного языка традиционно описывается в виде грамматических правил на естественном языке. Грамматика формального языка также может быть описана в виде множества правил на естественном языке. Но обычно для этого использу- ют специальные средства записи: формулы и схемы. В качестве примера рассмотрим простой формальный язык. Алфавит этого языка состоит из 17 букв: АБЕЗИЙКНОПРСТУЧШЫ и одного знака пунктуации — '.' (точки). Рассмотрим систему правил, составляющих грамматику языка. • Правила словообразования (мы не будем вдаваться в их подробное описание) позволяют сформировать из букв языка 5 различных иден- тификаторов (имён и ключевых слов): КУБ ШАР ПРОЗРАЧНЫЙ СИНИЙ УКРАШАЕТ и ни одним идентификатором больше. • Идентификаторы КУБ и ШАР считаются именами, прочие идентифи- каторы считаются ключевыми словами. • По весьма отдалённой аналогии с естественным языком, ключевые слова будут играть роли членов предложения и частей речи. • Определение сказуемого (это член предложения): ключевое слово УКРАШАЕТ считается сказуемым. • Определение прилагательного (это часть речи): ключевые слова ПРОЗРАЧНЫЙ и СИНИЙ считаются прилагательными. • Имена играют роль существительных. По аналогии с естественным языком, где предложения строятся из членов предложений, предложения-операторы языка состоят из членов предложений-выражений. Часть выражений считается подлежащими, часть — дополнениями. • Определение подлежащего: выражения-подлежащие состоят из клю- чевого слова-прилагательного и имени. • Определение дополнения: выражения-дополнения состоят из ключе- вого слова-прилагательного и имени (одного из двух). • Определение оператора (это последнее правило грамматики): пред- ложение состоит из тройки выражений, самым первым из которых яв- ляется подлежащее, затем сказуемое и дополнение. Предложение заканчивается точкой. Только что нами была определена грамматика формального языка. Она была описана привычным способом, с помощью нескольких предло- жений русского языка. Рассмотрим ещё один способ записи этой грамматики — с помощью формул. Запишем сначала в виде формулы определение оператора: оператор ::= подлежащее сказуемое дополнение . (1) В этой формуле символ ::= следует читать как "является" или "заменить". Затем определим в виде формул подлежащее и дополнение: подлежащее ::= прилагательное существительное (2) дополнение ::= прилагательное существительное (3) Следующая формула отражает тот факт, что сказуемым является ключевое слово УКРАШАЕТ. сказуемое УКРАШАЕТ (4) Следующее правило определяет прилагательное: прилагательное ::= ПРОЗРАЧНЫЙ | СИНИЙ (5) Здесь вертикальная черта между двумя ключевыми словами озна- чает, альтернативу (прилагательным в выражении может быть либо клю- чевое слово ПРОЗРАЧНЫЙ, либо ключевое слово СИНИЙ). Существует еще, по крайней мере, один способ описания альтернативы. Воспользуем- ся им при определении существительного. Это правило задаёт множество имён: существительное ШАР (6) КУБ Правила построения предложений в нашем языке оказались запи- саны с помощью шести коротких формул. Слова, стоящие справа и слева от знака "заменить" принято называть символами формальной граммати- ки, а сами формулы — грамматическими правилами. Заметим, что символы в формулах грамматики не являются слова- ми в обычном смысле этого слова. Символ в формуле является лишь своеобразным иероглифом, по внешнему виду напоминающим слово. При изменении внешнего вида символов суть формул грамматики нисколько бы не изменилась. Мы всего лишь используем возможность кодирования дополнительной информации с помощью внешнего вида символа. В наде- жде, что это поможет лучше понять происходящее. Символы, которые встречаются только в левой части правил, назы- ваются начальными нетерминальными символами или начальными не- терминалами. Символы, которые встречаются как в левой, так и в правой части грамматических правил называются нетерминальными символами. Символы, которые встречаются только в правой части правил, на- зываются терминальными символами. Воспользуемся этой грамматикой и построим несколько предложе- ний. Алгоритм порождения операторов-предложений и отдельных выраже- ний с помощью правил формальной грамматики очень прост: 1. Выбрать начальный нетерминал (в нашем случае это оператор) или отдельный нетерминальный символ, найти правило, содержащее этот символ в левой части и заменить его на символ или на последователь- ность символов из правой части правила. 8 2. Процесс замены продолжать до тех пор, пока в предложении будут встречаться нетерминальные символы. Выбор нетерминального символа обеспечивает порождение выра- жения, выбор начального нетерминала обеспечивает вывод оператора: оператор (1) подлежащее сказуемое дополнение . (2) прилагательное существительное сказуемое дополнение . 3) прилагательное существительное сказуемое прилагательное существительное. (4) прилагательное существительное УКРАШАЕТ прилагательное существительное. (5) ПРОЗРАЧНЫЙ существительное УКРАШАЕТ СИНИЙ существительное. (6) ПРОЗРАЧНЫЙ ШАР УКРАШАЕТ СИНИЙ КУБ. Больше терминальных символов нет. По правилам формальной грамматики мы построили первое предложение языка. Ещё одно предложение нашего языка: СИНИЙ КУБ УКРАШАЕТ ПРОЗРАЧНЫЙ КУБ. Формальная грамматика может использоваться не только для по- рождения предложений, но и для проверки, является ли какая-либо после- довательность символов выражением языка. Для этого среди символов исследуемой последовательности надо сначала отыскать терминальные символы и руководствуясь правилами формальной грамматики (справа налево), заменять терминальные символы нетерминальными, а затем "сворачивать" последовательности нетерминальных символов до тех пор, пока не будет получен начальный нетерминал, или единственный нетер- минальный символ. Так последовательность символов СИНИЙ КУБ ВЕНЧАЕТ ПРОЗРАЧНЫЙ КУБ. не является оператором языка, поскольку символ ВЕНЧАЕТ не встречает- ся среди нетерминальных символов. В свою очередь, пара терминальных символов СИНИЙ ШАР является выражением нашего языка и может быть как подлежащим, так и дополнением, поскольку может быть преобразова- на как в нетерминальный символ подлежащее, так и в нетерминальный символ дополнение. Рассмотренный нами способ записи правил грамматики языка на- зывается формами Бэкуса-Наура (сокращенно БНФ). Их не следует бояться. На них надо чаще смотреть. Их надо читать. Символы формальной грамматики складываются в основном из букв род- ного алфавита. Формы кратки и информативны. Правила, для изложения _

See more

The list of books you might like

Most books are stored in the elastic cloud where traffic is expensive. For this reason, we have a limit on daily download.