Б. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004 (1160791), страница 40
Текст из файла (страница 40)
Объявления разрешатся помещать в любом местс, где допустима инструкция (н епге в некоторых местах; у б.3.2.1, с1 6.8.3.1). Это сделано для того, чтобы программист мог свести к минимуму количество ошибок, вызываемых неинициализированными переменными, п для лучшей локализации кода. Редко возпнкаютситуацни, когда переменную нужно объявить до того, как она примет некоторое значение. Например: понц(оесГог<е!Ппу>с о, )пГ й сопеГ сйаг" р) ( (г чз==д) гегигп, (Г (!<О!) о егге ()<=1) еггог('неправильный индекс ), вгппув = о[ц; 1У (в == Р) ( О- Возможность помещения объявлений после исполняемого кода может иметь существешюе значение для многих констант и для стилей программирования с однократным присваиванием, когда значение объекта не меняется после инициализации.
В случае с типами, определяемыми пользователями, отказ от инициализации до тех пор, пока не станет доступен приемлемый пнпцпалпзатор, может привести к лучшей производительности. Например, еснпув, / ... *7 я = Лучшее — враг хорошего,', вполне может оказаться медленнее, чем вГгГпдв.= "Вольтер"; Наиболее частой причиной объявления переменной без инициализации является случай, когда для инициализации требуется инструкция.
Примерами люгут служить переменные, в которые осуществляется ввод, и массивы. 6.3.2. Инструкции выбора Значение может проверяться в инструкциях д и вшстссс (Г (условие)инструкция (1 (условие) инструкция е)ее инструкция етвсь(условие) инструкция Резулы атом применения операторов сравнения « = » = является 1гие, если сравнение истинно, иуа(ве в противном случае. Если выражение в инструкции (7" не равно нулю, выполняется первая (и возможно единственная) инструкция, в противном случае — вторая (если она указана).
Отсюда Глава 6. Выражения и инструкции следует, что в качестве условия могут использоваться любые арифметические выра- жения илп выражения с указателями. Например, если х целое, то )У)х) П- означает ))')х =О)П .. Для указателя р ~УФ)П-. является явной проверкой того, что <руказывает надопустимый объекта (т.
е. надлежа- щим образом инициализированный), в то время как У)р'=0)0- осуществляет ту же самую проверку менее явно, сравнивая указатель со значением, о котором известно, что оно не может указывать на объект. Обратите внимание, что «нулевойя указатель нс обязательно представляется нулевой последовательностью битов на всех л~ащинах Я 5.1.1).
Все компиляторы, которые я проверял, генерируют одинаковый код для обеих форм сравнения. Логические операторы Ь6 )) < наиболее часто используются в сравнениях. Операторы о<я и )) вычисляют второй аргумент, только если в атом есть необходимость.
Например, )г )р Йъ!<р — >совая) О ... сначала сравнивает р с нулем. Проверка 1<р->соипг осуществляется только в том случае, если р не равно нулю. Некоторые условные 1~ингтруции можно записывать в виде услояяьст яыражений. Например, )г' )а <=- Ь) тах=Ь; е1ке тая=а, лучше выглядит в следующем виде: щах = )а <= Ь) 2 Ь. а, Заключать сравнение в скобки необязательно, но, по-моему, так легче читать код.
ящ)1сй-инструкцию всегда можно заменить набором условных инструкций. Например, явпсй )са)) ( саяе б Л, Ьгеа/г; саке 2 2 ))' Ьгеад; 177 Б.З. Инструкции Йе)аи!Е. Ь (), ЬгеаК может быть записано как (1 (оа1 == !) Х(), е!яе !1' (оа! == 2) 20, е!яе Ь(); Смысл одинаковый, но первая форма (яш!1сй) предпочтительней, потому что лучше отражает идею сравнения (сопоставление значения с набором констант). Поэтому яш!1сл легче воспринимается при чтении нетривиальных примеров и сгенерированный код может оказаться лучше.
Отдавайте себе отчет в том, что каждая ветвь саяе должна как-нибудь завершаться, если вы не хотите, чтобы продолжали выполняться и другие инструкции саяе. Например, яв1гсй (оа!) ( саяе 1. сои!« 'саяе 11а'; саяе 2 сои! « "саяе 21н"; йе~аи!1 сои! « "де~аи!!.
ни один случай не соответствует"; ) при оа1=-! к великому изумлению непосвяп1енных выдаст саяе 1 саяе 2 йе)аи!1. ни один случай не соответствует Редкие случаи, когда такой подход осуществляется намеренно, лучше комментировать. Обычным способом завершения саяе является инструкция Ьгеай, но часто полезна и ге!игл Я 6.1,1).
6.3.2.1. Объявления в условиях Во иабежание случайного неправильного использования переменных их лучше вводить в наименьшей возможной области видимости. В частности, локальную переменную лучше объявлять в тот момент, когда ей надо присвоить значение. В этом случае исключаются попытки использования переменной до момента ее инициализации. Одним из самых элегантных применений этих идей является объявление переменной в условии. Рассмотрим пример: (1' (доиЫе с!= рг!т (иве)) ( !е711=- д; ЬгеаК ) Глава б.
Выражения и инструкции )78 В примере происходит объявление переменной с(, в после инициализации она проверяется в условии. Область видимости переменной с( простирается от ее точки объявления до конца инструкции, контролируемой условием. Если бы в инструкции ((была ветвь е1ве, областью видимости с( были бы обе ветви. Очевидной и традиционной альтернативой является обьявление переменной с(до ссловия, но в этом случае область видимости началась бы до места использования переменной и продолжалась бы после завершения ее «сознательной' жизни: с(виЬ(е с(, О.
с(2 = с(, 0- ,Ссс Внилиание! (1' (с( = рг(т (и ие)) ( (ез) 1= с(, Ьгеад, сс1 два несвязанных использования д с(= 20, Объявление переменных в условиях, кроме логических преимуществ, приводит к более компактному исходному коду. Объявление в условии должно объявлять и инициализировать единственную переменную или константу 6.3.3.
Инструкции циклов Дикльз можно выразить инструкциями трех видов — 1ог, ш(с(1е и с(а: тlи(е (рс«авив) инструкция с(а инстр(скчсся тЬВе ( выразкенссе ); лаг ( инил нализ иРдюи)а Я гснссиРДклиЯ уел авиен,„выРа жение е ) инстРДкдил Каждая из этих инструкций приводит к многократному выполнению инструкций (называемых также унравляелзыми инструкциями или телом цикла) ло тех пор, пока условие пе примет значение 1а(ве, либо программист не прервет цикл каким-либо другим способом.
1ог-инструкция предназначена для реализации регулярных циклов. Переменную цикла, условие завершения и выражение, которое модифицирует переменную цикла, можно записать в единственной строке. Это, как правило, увеличивает читабельность кода и, следовательно, ведет к уменьшению ошибок. Если инициализация не требуется, соответствующая часть может бгять опущена.
Если отсутствует условие, (ог-инстрвкция будет либо выполняться вечно, либо будет явно прервана при помощи Ьгеай, ге(ига, йа!о, (йгош нли менее явным способом, вроде вызова функции ехЫ () Я 9А.1.1). Если выражение пропущено, мы должны обновлять некоторую переменную цикла в теле цикла. Если цикл не принадлежит типу «введи переменную цикла, проверь условие, модифицируй перемен пузо цикла, его лучпзе записать в ниле инструкции шй)1е. Полезным примером использования цлклауог является случай, когда явно не указывается условие завершения: б 3. Инструкции Уаг[,)[ О «вечно» О.. ш)г((е-инструкцпя просто исполняет тело цикла до тех пор, пока условие не станет ГаЬе.
Я предпочитаю пользоваться циклом щЫе вместо гог, когда нет очевидной переменной цикла, либо когда естественным местом для ее модификации является середина гела цикла. Пикл ввода является примером цикла, где нет очевидной пер— менной цикла: шй)!е [с)п»сй) 0-. По моему мнению, г(о-инструкция является источником ошибок и путаницы. Причинаа заключается в том, что ес тело всегда один раз выполняется до проверки условия. Но лля того чтобы тело выполнялось корректно, что-то типа условия должно выполняться даже при первом проходе.
Чаще, чем я мог бы предположить, я сталкивался со случаями, когда условие не выполнялось (как от него ожидали) либо когда программа была первый раз написана и отлажена, либо позднее, после того, как предшествующий код был изменен. Также я предпочитаю явные условия, которые я мог бы легко проверить. Соответственно, я не склонен использовать с(о-инструкцию 6.3.3.1. Объявления в Фог-инструкции Переменную можно объявить в части инициализации инструкциигог. В этом случае область видимости переменной (илп перемеьшых) простирается до конца~оп-ипстг рукции. Например: пагаЯпГ и[], гпГ тах) ( ~ог [юг 1 = О, 1«тах, г'н-) э[1) = рб Если требуется узнать значение индекса после выхода из цн кланг, переменную надо объявить вне его (пример з 6.3.4).
6.3.4. цо(о В С+в имеется пресловутая инструкция до(о: доГо адентпфикатор; пдептягрикатор. пнапрркяия Существует очень мало примеров нспользонания до(о прн программировании на высоком уровне, но зта инструкция может быть крайне полезна, когда код С-ьч генерируется программой, а не человеком. Например, рого могут быть использованы в анализаторе, сгенерированном по описанию грамматики. Инструкция до(о может также оказаться полезной в редких случаях, когда требуется максимальная производительность, например во внутреннем цикле приложения, работающего в реальном времени.
Одним из немногих разумных способов использования дога в обычном коде является выход из вложенного никла или зш(Гсл-инструкции (Ьг еав прекращает выполнение только самого внутреннего цикла или знл(сл-инструкции). Например: 180 Глава б. Выражения и инструкции оосдУ'с) ( спг с, спг1', аког Сс=у, с<п, сь<1 гогс'=0,1<си,)+ь~ сг1пт1с)сс)== а~ уогогоипд, с сс не тсидено О.. Уоипд 0 ии==.
Имеется также инструкция соп1спие, которая передает управление в конец цикла (см. ч 6.1.5). 6.4. Комментарии и отступы Разумное использование комментариев и согласованное употребление отступов может сделать чтение и понимание программы более приятным занятием. Существует песка лько стилей отступов. Я не нижу основательных причин предпочитать один из них другому (хотя, как и у большинства программистов, у меня есть свои привычки, продемонстрированные в этой книге). То же самое можно сказать и о стиле комментариев Прп неправильном использовании комментариев может серьезно пострадать читабельность программы.