Присваивание

Поделись знанием:
Перейти к: навигация, поиск

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

Присваивание является одной из центральных конструкций в императивных языках программирования, эффективно и просто реализуется на фон-неймановской архитектуре, которая является основой современных компьютеров.

В логическом программировании принят другой, алгебраический подход. Обычного («разрушающего») присвоения здесь нет. Существуют только неизвестные, которые ещё не вычислены, и соответствующие идентификаторы для обозначения этих неизвестных. Программа только определяет их значения, сами они постоянны. Конечно, в реализации программа производит запись в память, но языки программирования этого не отражают, давая программисту возможность работать с идентификаторами постоянных значений, а не с переменными.

В чистом функциональном программировании не используются переменные, и явный оператор присваивания не нужен.





Определение

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

<выражение слева> <оператор присваивания> <выражение справа>

«Выражение слева» должно после вычисления привести к местоположению объекта данных, к целевой переменной, идентификатору ячейки памяти, в которую будет производиться запись. Такие ссылки называются «левосторонними значениями» (англ. lvalue). Типичные примеры левостороннего значения — имя переменной (x), путь к переменной в пространстве имён и библиотеках (Namespace.Library.Object.AnotherObject.Property), путь к массиву с выражением на месте индекса (this.a[i+j*k]), но ниже в данной статье приведены и более сложные варианты.

«Выражение справа» должно обозначать тем или иным способом ту величину, которая будет присвоена объекту данных. Таким образом, даже если справа стои́т имя той же переменной, что и слева, интерпретируется оно иначе — такие ссылки называются «правосторонними значениями» (англ. rvalue). Дальнейшие ограничения на выражение накладывает используемый язык: так, в статически типизированных языках оно должно иметь тот же тип, что и целевая переменная, либо тип, приводимый к нему; в некоторых языках (например, Си или Python) в выражение может входить также другая операция присваивания (a=b=c).

В роли оператора присваивания в языках программирования чаще всего выступают =, := или . Но специальный синтаксис может и не вводиться — например, в Tcl:

set <целевая_переменная> <выражение>

Данная запись эквивалентна вызову функции. Аналогично, в КОБОЛе старого стиля:

MULTIPLY 2 BY 2 GIVING FOUR.

Алгоритм работы

  • Вычислить левостороннее значение первого операнда. На этом этапе становится известным местонахождение целевого объекта, приёмника нового значения.
  • Вычислить правостороннее значение второго операнда. Этот этап может быть сколь угодно большим и включать другие операторы (в том числе присвоения).
  • Присвоить вычисленное правостороннее значение левостороннему значению. Во-первых, при конфликте типов должно быть осуществлено их приведение (либо выдано сообщение об ошибке ввиду его невозможности). Во-вторых, собственно присваивания значения в современных языках программирования может быть подменено и включать не только перенос значений ячеек памяти (например, в «свойства» объектов в C#, перегрузка операторов).
  • Возвратить вычисленное правостороннее значение как результат выполнения операции. Требуется не во всех языках (например, не нужно в Паскале).

Обозначение

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

Так, Никлаус Вирт утверждал[1]:

Общеизвестным плохим примером является выбор знака равенства для обозначения присваивания, восходящий к языку Fortran в 1957 году и слепо повторяемый до сих пор массой разработчиков языков. Эта плохая идея низвергает вековую традицию использования знака «=» для обозначения сравнения на равенство, предиката, принимающего значения «истина» или «ложь». Но в Fortran этот символ стал обозначать присваивание, принуждение к равенству. В этом случае операнды находятся в неравном положении: левый операнд, переменная, должен быть сделан равным правому операнду, выражению. Поэтому x = y не означает то же самое, что y = x.

Реализацией этой позиции Вирта можно считать то, что в языке Паскаль, автором которого он является, оператором присваивания является :=, в то время как для сравнения используется просто =.

Выбор символа оператора равенства в языке при использовании = как присваивания решается:

  • Введением нового символа языка для оператора проверки равенства.

Запись равенства в Си == является источником частых ошибок из-за возможности использования присваивания в управляющих конструкциях, но в других языках проблема решается введением дополнительных ограничений.

  • Использованием этого же символа значение определяется в зависимости от контекста.

Например, в выражении языка ПЛ/1:

А = В = С	

переменной А присваивается булевское значение выражения отношения В = С. Такая запись приводит к снижению читабельности и редко используется.

Семантические особенности

Далеко не всегда «интуитивный» (для программистов императивных языков) способ интерпретации присваивания является единственно верным и возможным.

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

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

Пример:

\ Определение переменной AAA и следующей строкой присваивание ей значения 10
VARIABLE AAA
10 AAA !

То же самое немного иначе:

10
VARIABLE AAA
AAA !

Неоднозначность

Рассмотрим пример:

X = 2 + 1

Это можно понять как «результат вычисления 2+1 (то есть 3) присваивается переменной X» или как «операция 2+1 присваивается переменной X». Если язык статически типизирован, то двусмысленности нет, она разрешается типом переменной X («целое число» или «операция»). В языке Пролог типизация динамическая, поэтому существуют две операции присвоения: is — присвоение эквивалентного значения и = — присвоение образца. В таком случае:

X is 2 + 1, X = 3
X = 2 + 1, X = 3

Первая последовательность будет признана верной, вторая — ложной.

Семантика ссылок

При работе с объектами больших размеров и сложной структуры многие языки используют так называемую «семантику ссылок». Это означает, что присвоения в классическом смысле не происходит, но считается, что значение целевой переменной располагается на том же месте, что и значение исходной. Например (Python):

a = [1, 2, 3]
b = a
a[1] = 1000

После этого b будет иметь значение [1, 1000, 3] — просто потому, что фактически его значение — это и есть значение a. Число ссылок на один и тот же объект данных называется его мощностью, а сам объект погибает (уничтожается или отдаётся сборщику мусора), когда его мощность достигает нуля. Языки программирования более низкого уровня (например, Си) позволяют программисту явно управлять тем, используется семантика указателей или семантика копирования.

Подмена операции

Многие языки предоставляют возможность подмены смысла присвоения: либо через механизм свойств, либо через перегрузку оператора присвоения. Подмена может понадобиться для выполнения проверок на допустимость присваиваемого значения или любых других дополнительных операций. Перегрузка оператора присвоения часто используется для обеспечения «глубокого копирования», то есть копирования значений, а не ссылок, которые во многих языках копируются по умолчанию.

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

Расширенные конструкции

Поскольку операция присвоения является широко используемой, разработчики языков программирования пытаются разработать новые конструкции для упрощённой записи типичных операций (добавить в язык так называемый «синтаксический сахар»). Кроме этого, в низкоуровневых языках программирования часто критерием включения операции является возможность компиляции в эффективный исполняемый код.[3] Особенно известен данным свойством язык Си.

Множественные целевые объекты

Одной из альтернатив простого оператора является возможность присвоения значения выражения нескольким объектам. Например, в языке ПЛ/1 оператор

SUM, TOTAL = 0

одновременно присваивает нулевое значение переменным SUM и TOTAL. В языке Ада присвоение также является оператором, а не выражением, поэтому запись множественного присвоения имеет вид:

SUM, TOTAL: Integer := 0;

Аналогичное присвоение в языке Python имеет следующий синтаксис:

sum = total = 0

В отличие от ПЛ/1, Ады и Python, где множественное присвоение считается только сокращённой формой записи, в языках Си, Лисп и других данный синтаксис имеет строгую основу: просто оператор присвоения возвращает присвоенное им значение (см. выше). Таким образом, последний пример — это на самом деле:

sum = (total = 0)

Строчка такого вида сработает в Си (если добавить точку с запятой в конце), но вызовет ошибку в Python.

Параллельное присваивание

Некоторые языки, например, Ruby и Python, поддерживают расширенный синтаксис присвоения, который называется параллельным присвоением:

a, b = 1, 11

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

Запись с использованием параллельного присваивания «Традиционное» присвоение: требует дополнительной переменной и трёх операций «Экономное» присвоение: не требует дополнительной переменной, но также содержит три операции Еще более «экономное» присвоение: не требует дополнительной переменной, работает с битовыми операциями
a, b = b, a
t = a
a = b
b = t
a = a + b
b = a - b
a = a - b
a ^= b
b ^= a
a ^= b

Предпоследний вариант с арифметическими операциями небезопасен в языках программирования или на аппаратных платформах, которые проверяют наличие арифметических переполнений.

Последний вариант работает только с типами, поддерживающими битовые операции (например, для double компилятор языка C# не позволит обменять значения переменных таким способом).

Некоторые языки (например, PHP) имеют конструкции, позволяющие сымитировать параллельное присваивание:

list( $a, $b ) = array( $b, $a );

Условные целевые объекты

Некоторые языки программирования, например, C++, допускают использование в операторах присвоения условных целевых объектов. Например, выражение:

( flag ? count1 : count2 ) = О;

присвоит значение 0 переменной count1, если flag==true, и count2, если flag==false.

Другой вариант условного присваивания (Руби):

a ||= 10

Данная конструкция присваивает переменной a значение только в том случае, если значение ещё не присвоено или равно false.

Составные операторы

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

а = а + b

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

sum += value;
sum = sum + value;

В языках программирования, поддерживающих составные операторы (C++, C#, Python, Java и др.), обычно существуют версии для большинства бинарных операторов этих языков (+=, -=, &= и т. п.).

Унарные операторы

В языках семейства Си существуют четыре унарных (то есть принимающих один аргумент) арифметических оператора для увеличения и уменьшения чисел на единицу: два оператора «++» и два — «--». Операторы могут записываться перед операндом (префиксные) или после него (постфиксные или суффиксные). Префиксные и постфиксные операторы отличаются порядком вычислений. Префиксные операторы изменяют число на единицу и возвращают изменённое число. Постфиксные операторы сохраняют число во временной переменной, изменяют исходное число и возвращают значение временной переменной.

Пример использования оператора ++:

Увеличение значения переменной на единицу Эквивалентная запись
count ++; count = count + 1;

Хоть это и не выглядит присваиванием, но таковым является. Результат выполнения приведённого выше оператора равнозначен результату выполнения присваивания.

Операторы «++» называются операторами инкремента, а операторы «--» — операторами декремента. Операторы часто используются в языке C при работе с указателями и индексами массивов.

Реализация

Работа современных компьютеров состоит из считываний данных из памяти или устройства в регистры, выполнения операций над этими данными и записи в память или устройство. Основной операцией здесь является пересылка данных (из регистров в память, из памяти в регистр, из регистра в регистр). Соответственно, она выражается напрямую командами современных процессоров. Так, для архитектуры x86 (все нижеприведённые команды относятся также к данной архитектуре) это операция mov и её разновидности для пересылки данных различных размеров. Операция присваивания (пересылка данных из одной ячейки памяти в другую) практически непосредственно реализуется данной командой. Вообще говоря, для выполнения пересылки данных в памяти требуется две инструкций: перемещение из памяти в регистр и из регистра в память, но при использовании оптимизации в большинстве случаев количество команд можно сократить.

movl -4(%ebp), %eax
movl  %eax, 8(%ebp)


Пример кодогенерации (GCC), две
инструкции для присваивания

См. также

Напишите отзыв о статье "Присваивание"

Примечания

  1. Никлаус Вирт. [www.citforum.ru/programming/digest/wirth/ Хорошие идеи: взгляд из Зазеркалья]. Пер. Сергей Кузнецов (2006). Проверено 23 апреля 2006. [www.webcitation.org/61938mMo3 Архивировано из первоисточника 23 августа 2011].
  2. Niklaus Wirth. [citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.88.8309&rep=rep1&type=pdf Good Ideas, Through the Looking Glass]. Проверено 4 декабря 2010. [www.webcitation.org/68gbe1eLY Архивировано из первоисточника 25 июня 2012].
  3. В целях оптимизации многие операции совмещаются с присваиванием. Для сокращённых записей присвоения зачастую есть эквивалент в машинных инструкциях. Так, увеличение на единицу реализуется машинной инструкцией inc, уменьшение на единицу — dec, сложение с присвоением — add, вычитание с присвоением — sub, команды условной пересылки — cmova, cmovno и т. д.

Литература

  • Роберт В. Себеста. Основные концепции языков программирования = Concepts of Programming Languages. — 5-е изд. — М.: Вильямс, 2001. — 672 с. — ISBN 0-201-75295-6.
  • М. Бен-Ари. Языки программирования. Практический сравнительный анализ. — М.: Мир, 2000. — 366 с. С. 71—74.
  • В. Э. Вольфенгаген. Конструкции языков программирования. Приёмы описания. — М.: АО «Центр ЮрИнфоР», 2001. — 276 с. ISBN 5-89158-079-9. С. 128—131.
  • Э. А. Опалева, В. П. Самойленко. Языки программирования и методы трансляции. — СПб.: БХВ-Петербург, 2005. — 480 с. ISBN 5-94157-327-8. С. 74—75.
  • Т. Пратт, М. Зелковиц. Языки программирования: разработка и реализация. — 4-е изд. — СПб: Питер, 2002. — 688 с. ISBN 5-318-00189-0, ISBN 0-13-027678-2. С. 201—204.

Отрывок, характеризующий Присваивание

Государь выслушал молча, не глядя на Мишо.
– L'ennemi est il en ville? [Неприятель вошел в город?] – спросил он.
– Oui, sire, et elle est en cendres a l'heure qu'il est. Je l'ai laissee toute en flammes, [Да, ваше величество, и он обращен в пожарище в настоящее время. Я оставил его в пламени.] – решительно сказал Мишо; но, взглянув на государя, Мишо ужаснулся тому, что он сделал. Государь тяжело и часто стал дышать, нижняя губа его задрожала, и прекрасные голубые глаза мгновенно увлажились слезами.
Но это продолжалось только одну минуту. Государь вдруг нахмурился, как бы осуждая самого себя за свою слабость. И, приподняв голову, твердым голосом обратился к Мишо.
– Je vois, colonel, par tout ce qui nous arrive, – сказал он, – que la providence exige de grands sacrifices de nous… Je suis pret a me soumettre a toutes ses volontes; mais dites moi, Michaud, comment avez vous laisse l'armee, en voyant ainsi, sans coup ferir abandonner mon ancienne capitale? N'avez vous pas apercu du decouragement?.. [Я вижу, полковник, по всему, что происходит, что провидение требует от нас больших жертв… Я готов покориться его воле; но скажите мне, Мишо, как оставили вы армию, покидавшую без битвы мою древнюю столицу? Не заметили ли вы в ней упадка духа?]
Увидав успокоение своего tres gracieux souverain, Мишо тоже успокоился, но на прямой существенный вопрос государя, требовавший и прямого ответа, он не успел еще приготовить ответа.
– Sire, me permettrez vous de vous parler franchement en loyal militaire? [Государь, позволите ли вы мне говорить откровенно, как подобает настоящему воину?] – сказал он, чтобы выиграть время.
– Colonel, je l'exige toujours, – сказал государь. – Ne me cachez rien, je veux savoir absolument ce qu'il en est. [Полковник, я всегда этого требую… Не скрывайте ничего, я непременно хочу знать всю истину.]
– Sire! – сказал Мишо с тонкой, чуть заметной улыбкой на губах, успев приготовить свой ответ в форме легкого и почтительного jeu de mots [игры слов]. – Sire! j'ai laisse toute l'armee depuis les chefs jusqu'au dernier soldat, sans exception, dans une crainte epouvantable, effrayante… [Государь! Я оставил всю армию, начиная с начальников и до последнего солдата, без исключения, в великом, отчаянном страхе…]
– Comment ca? – строго нахмурившись, перебил государь. – Mes Russes se laisseront ils abattre par le malheur… Jamais!.. [Как так? Мои русские могут ли пасть духом перед неудачей… Никогда!..]
Этого только и ждал Мишо для вставления своей игры слов.
– Sire, – сказал он с почтительной игривостью выражения, – ils craignent seulement que Votre Majeste par bonte de c?ur ne se laisse persuader de faire la paix. Ils brulent de combattre, – говорил уполномоченный русского народа, – et de prouver a Votre Majeste par le sacrifice de leur vie, combien ils lui sont devoues… [Государь, они боятся только того, чтобы ваше величество по доброте души своей не решились заключить мир. Они горят нетерпением снова драться и доказать вашему величеству жертвой своей жизни, насколько они вам преданы…]
– Ah! – успокоенно и с ласковым блеском глаз сказал государь, ударяя по плечу Мишо. – Vous me tranquillisez, colonel. [А! Вы меня успокоиваете, полковник.]
Государь, опустив голову, молчал несколько времени.
– Eh bien, retournez a l'armee, [Ну, так возвращайтесь к армии.] – сказал он, выпрямляясь во весь рост и с ласковым и величественным жестом обращаясь к Мишо, – et dites a nos braves, dites a tous mes bons sujets partout ou vous passerez, que quand je n'aurais plus aucun soldat, je me mettrai moi meme, a la tete de ma chere noblesse, de mes bons paysans et j'userai ainsi jusqu'a la derniere ressource de mon empire. Il m'en offre encore plus que mes ennemis ne pensent, – говорил государь, все более и более воодушевляясь. – Mais si jamais il fut ecrit dans les decrets de la divine providence, – сказал он, подняв свои прекрасные, кроткие и блестящие чувством глаза к небу, – que ma dinastie dut cesser de rogner sur le trone de mes ancetres, alors, apres avoir epuise tous les moyens qui sont en mon pouvoir, je me laisserai croitre la barbe jusqu'ici (государь показал рукой на половину груди), et j'irai manger des pommes de terre avec le dernier de mes paysans plutot, que de signer la honte de ma patrie et de ma chere nation, dont je sais apprecier les sacrifices!.. [Скажите храбрецам нашим, скажите всем моим подданным, везде, где вы проедете, что, когда у меня не будет больше ни одного солдата, я сам стану во главе моих любезных дворян и добрых мужиков и истощу таким образом последние средства моего государства. Они больше, нежели думают мои враги… Но если бы предназначено было божественным провидением, чтобы династия наша перестала царствовать на престоле моих предков, тогда, истощив все средства, которые в моих руках, я отпущу бороду до сих пор и скорее пойду есть один картофель с последним из моих крестьян, нежели решусь подписать позор моей родины и моего дорогого народа, жертвы которого я умею ценить!..] Сказав эти слова взволнованным голосом, государь вдруг повернулся, как бы желая скрыть от Мишо выступившие ему на глаза слезы, и прошел в глубь своего кабинета. Постояв там несколько мгновений, он большими шагами вернулся к Мишо и сильным жестом сжал его руку пониже локтя. Прекрасное, кроткое лицо государя раскраснелось, и глаза горели блеском решимости и гнева.
– Colonel Michaud, n'oubliez pas ce que je vous dis ici; peut etre qu'un jour nous nous le rappellerons avec plaisir… Napoleon ou moi, – сказал государь, дотрогиваясь до груди. – Nous ne pouvons plus regner ensemble. J'ai appris a le connaitre, il ne me trompera plus… [Полковник Мишо, не забудьте, что я вам сказал здесь; может быть, мы когда нибудь вспомним об этом с удовольствием… Наполеон или я… Мы больше не можем царствовать вместе. Я узнал его теперь, и он меня больше не обманет…] – И государь, нахмурившись, замолчал. Услышав эти слова, увидав выражение твердой решимости в глазах государя, Мишо – quoique etranger, mais Russe de c?ur et d'ame – почувствовал себя в эту торжественную минуту – entousiasme par tout ce qu'il venait d'entendre [хотя иностранец, но русский в глубине души… восхищенным всем тем, что он услышал] (как он говорил впоследствии), и он в следующих выражениях изобразил как свои чувства, так и чувства русского народа, которого он считал себя уполномоченным.
– Sire! – сказал он. – Votre Majeste signe dans ce moment la gloire de la nation et le salut de l'Europe! [Государь! Ваше величество подписывает в эту минуту славу народа и спасение Европы!]
Государь наклонением головы отпустил Мишо.


В то время как Россия была до половины завоевана, и жители Москвы бежали в дальние губернии, и ополченье за ополченьем поднималось на защиту отечества, невольно представляется нам, не жившим в то время, что все русские люди от мала до велика были заняты только тем, чтобы жертвовать собою, спасать отечество или плакать над его погибелью. Рассказы, описания того времени все без исключения говорят только о самопожертвовании, любви к отечеству, отчаянье, горе и геройстве русских. В действительности же это так не было. Нам кажется это так только потому, что мы видим из прошедшего один общий исторический интерес того времени и не видим всех тех личных, человеческих интересов, которые были у людей того времени. А между тем в действительности те личные интересы настоящего до такой степени значительнее общих интересов, что из за них никогда не чувствуется (вовсе не заметен даже) интерес общий. Большая часть людей того времени не обращали никакого внимания на общий ход дел, а руководились только личными интересами настоящего. И эти то люди были самыми полезными деятелями того времени.
Те же, которые пытались понять общий ход дел и с самопожертвованием и геройством хотели участвовать в нем, были самые бесполезные члены общества; они видели все навыворот, и все, что они делали для пользы, оказывалось бесполезным вздором, как полки Пьера, Мамонова, грабившие русские деревни, как корпия, щипанная барынями и никогда не доходившая до раненых, и т. п. Даже те, которые, любя поумничать и выразить свои чувства, толковали о настоящем положении России, невольно носили в речах своих отпечаток или притворства и лжи, или бесполезного осуждения и злобы на людей, обвиняемых за то, в чем никто не мог быть виноват. В исторических событиях очевиднее всего запрещение вкушения плода древа познания. Только одна бессознательная деятельность приносит плоды, и человек, играющий роль в историческом событии, никогда не понимает его значения. Ежели он пытается понять его, он поражается бесплодностью.
Значение совершавшегося тогда в России события тем незаметнее было, чем ближе было в нем участие человека. В Петербурге и губернских городах, отдаленных от Москвы, дамы и мужчины в ополченских мундирах оплакивали Россию и столицу и говорили о самопожертвовании и т. п.; но в армии, которая отступала за Москву, почти не говорили и не думали о Москве, и, глядя на ее пожарище, никто не клялся отомстить французам, а думали о следующей трети жалованья, о следующей стоянке, о Матрешке маркитантше и тому подобное…
Николай Ростов без всякой цели самопожертвования, а случайно, так как война застала его на службе, принимал близкое и продолжительное участие в защите отечества и потому без отчаяния и мрачных умозаключений смотрел на то, что совершалось тогда в России. Ежели бы у него спросили, что он думает о теперешнем положении России, он бы сказал, что ему думать нечего, что на то есть Кутузов и другие, а что он слышал, что комплектуются полки, и что, должно быть, драться еще долго будут, и что при теперешних обстоятельствах ему не мудрено года через два получить полк.
По тому, что он так смотрел на дело, он не только без сокрушения о том, что лишается участия в последней борьбе, принял известие о назначении его в командировку за ремонтом для дивизии в Воронеж, но и с величайшим удовольствием, которое он не скрывал и которое весьма хорошо понимали его товарищи.
За несколько дней до Бородинского сражения Николай получил деньги, бумаги и, послав вперед гусар, на почтовых поехал в Воронеж.
Только тот, кто испытал это, то есть пробыл несколько месяцев не переставая в атмосфере военной, боевой жизни, может понять то наслаждение, которое испытывал Николай, когда он выбрался из того района, до которого достигали войска своими фуражировками, подвозами провианта, гошпиталями; когда он, без солдат, фур, грязных следов присутствия лагеря, увидал деревни с мужиками и бабами, помещичьи дома, поля с пасущимся скотом, станционные дома с заснувшими смотрителями. Он почувствовал такую радость, как будто в первый раз все это видел. В особенности то, что долго удивляло и радовало его, – это были женщины, молодые, здоровые, за каждой из которых не было десятка ухаживающих офицеров, и женщины, которые рады и польщены были тем, что проезжий офицер шутит с ними.
В самом веселом расположении духа Николай ночью приехал в Воронеж в гостиницу, заказал себе все то, чего он долго лишен был в армии, и на другой день, чисто начисто выбрившись и надев давно не надеванную парадную форму, поехал являться к начальству.
Начальник ополчения был статский генерал, старый человек, который, видимо, забавлялся своим военным званием и чином. Он сердито (думая, что в этом военное свойство) принял Николая и значительно, как бы имея на то право и как бы обсуживая общий ход дела, одобряя и не одобряя, расспрашивал его. Николай был так весел, что ему только забавно было это.
От начальника ополчения он поехал к губернатору. Губернатор был маленький живой человечек, весьма ласковый и простой. Он указал Николаю на те заводы, в которых он мог достать лошадей, рекомендовал ему барышника в городе и помещика за двадцать верст от города, у которых были лучшие лошади, и обещал всякое содействие.
– Вы графа Ильи Андреевича сын? Моя жена очень дружна была с вашей матушкой. По четвергам у меня собираются; нынче четверг, милости прошу ко мне запросто, – сказал губернатор, отпуская его.
Прямо от губернатора Николай взял перекладную и, посадив с собою вахмистра, поскакал за двадцать верст на завод к помещику. Все в это первое время пребывания его в Воронеже было для Николая весело и легко, и все, как это бывает, когда человек сам хорошо расположен, все ладилось и спорилось.
Помещик, к которому приехал Николай, был старый кавалерист холостяк, лошадиный знаток, охотник, владетель коверной, столетней запеканки, старого венгерского и чудных лошадей.
Николай в два слова купил за шесть тысяч семнадцать жеребцов на подбор (как он говорил) для казового конца своего ремонта. Пообедав и выпив немножко лишнего венгерского, Ростов, расцеловавшись с помещиком, с которым он уже сошелся на «ты», по отвратительной дороге, в самом веселом расположении духа, поскакал назад, беспрестанно погоняя ямщика, с тем чтобы поспеть на вечер к губернатору.
Переодевшись, надушившись и облив голову холодной подои, Николай хотя несколько поздно, но с готовой фразой: vaut mieux tard que jamais, [лучше поздно, чем никогда,] явился к губернатору.
Это был не бал, и не сказано было, что будут танцевать; но все знали, что Катерина Петровна будет играть на клавикордах вальсы и экосезы и что будут танцевать, и все, рассчитывая на это, съехались по бальному.
Губернская жизнь в 1812 году была точно такая же, как и всегда, только с тою разницею, что в городе было оживленнее по случаю прибытия многих богатых семей из Москвы и что, как и во всем, что происходило в то время в России, была заметна какая то особенная размашистость – море по колено, трын трава в жизни, да еще в том, что тот пошлый разговор, который необходим между людьми и который прежде велся о погоде и об общих знакомых, теперь велся о Москве, о войске и Наполеоне.
Общество, собранное у губернатора, было лучшее общество Воронежа.
Дам было очень много, было несколько московских знакомых Николая; но мужчин не было никого, кто бы сколько нибудь мог соперничать с георгиевским кавалером, ремонтером гусаром и вместе с тем добродушным и благовоспитанным графом Ростовым. В числе мужчин был один пленный итальянец – офицер французской армии, и Николай чувствовал, что присутствие этого пленного еще более возвышало значение его – русского героя. Это был как будто трофей. Николай чувствовал это, и ему казалось, что все так же смотрели на итальянца, и Николай обласкал этого офицера с достоинством и воздержностью.
Как только вошел Николай в своей гусарской форме, распространяя вокруг себя запах духов и вина, и сам сказал и слышал несколько раз сказанные ему слова: vaut mieux tard que jamais, его обступили; все взгляды обратились на него, и он сразу почувствовал, что вступил в подобающее ему в губернии и всегда приятное, но теперь, после долгого лишения, опьянившее его удовольствием положение всеобщего любимца. Не только на станциях, постоялых дворах и в коверной помещика были льстившиеся его вниманием служанки; но здесь, на вечере губернатора, было (как показалось Николаю) неисчерпаемое количество молоденьких дам и хорошеньких девиц, которые с нетерпением только ждали того, чтобы Николай обратил на них внимание. Дамы и девицы кокетничали с ним, и старушки с первого дня уже захлопотали о том, как бы женить и остепенить этого молодца повесу гусара. В числе этих последних была сама жена губернатора, которая приняла Ростова, как близкого родственника, и называла его «Nicolas» и «ты».
Катерина Петровна действительно стала играть вальсы и экосезы, и начались танцы, в которых Николай еще более пленил своей ловкостью все губернское общество. Он удивил даже всех своей особенной, развязной манерой в танцах. Николай сам был несколько удивлен своей манерой танцевать в этот вечер. Он никогда так не танцевал в Москве и счел бы даже неприличным и mauvais genre [дурным тоном] такую слишком развязную манеру танца; но здесь он чувствовал потребность удивить их всех чем нибудь необыкновенным, чем нибудь таким, что они должны были принять за обыкновенное в столицах, но неизвестное еще им в провинции.
Во весь вечер Николай обращал больше всего внимания на голубоглазую, полную и миловидную блондинку, жену одного из губернских чиновников. С тем наивным убеждением развеселившихся молодых людей, что чужие жены сотворены для них, Ростов не отходил от этой дамы и дружески, несколько заговорщически, обращался с ее мужем, как будто они хотя и не говорили этого, но знали, как славно они сойдутся – то есть Николай с женой этого мужа. Муж, однако, казалось, не разделял этого убеждения и старался мрачно обращаться с Ростовым. Но добродушная наивность Николая была так безгранична, что иногда муж невольно поддавался веселому настроению духа Николая. К концу вечера, однако, по мере того как лицо жены становилось все румянее и оживленнее, лицо ее мужа становилось все грустнее и бледнее, как будто доля оживления была одна на обоих, и по мере того как она увеличивалась в жене, она уменьшалась в муже.