Б. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004 (1160791), страница 41
Текст из файла (страница 41)
Комсснлятор не понимает смысл комментариев, поэтому не существует способа проверить, что комментарий 11) содер>кателесс; [2] имеет какое-то отношение к программе; 131 не устарел. В большинстве программ можно найти труднопонимасмые, противоречивые и просто неверные комментарии. Плохой комментарий хуже его отсутствия. Если что-то может быть выражено непосредственно конгтрукциялпс языка, так оно и должно быть сделано, простого упоминания в комментарии недостаточно. Предыдущее замечание имеет в виду комментарии типа: О переменную "о" надо нроинициолизировать ,Ссс перелсенная "о' должна использоваптгя только функцией ",~1)" ссс перед вьаовоя любой другой функции из згпого фаила, вьсзовите функцшо "с т~ 1) ' сгсс вызовите функцию 'с1еатср Г) ' в конце васией програиисы ссс не пользуйтесь функцией "свесгд1)' сс~с у фуню1сш ",С 1) ' два аргуяен пса При ссравпльпом использовании Сч-л- такие комментарии часто становятся ненужныкси.
Например, чтобы избавиться от предыдусцих комментариев, можно полагаться на правила компоновки 1й 9.2) и области видимости, инициализации и очистки для классов (слс. 9 10А.1). Если что-либо ясно выражено в языке, не надо это повторять второй раз в комментарии. Например: а=Ь+с, сс'а приншчаесп зна'сение, равное Ььг соипсь+, сссс увели шли счетчик /В1 блб Советы И дело не только в том, что такие комментарии просто излишни, Оии увеличивают количество текста, который надо прочесть, часто затеняют структуру программы и не редко просто ошибочны.
Впрочем, обратите внимание: подобные комментарии часто встречаются в учебных пособиях типа того, что вы сейчас читаете. Это одна нз многих черт, которыми реальные программы отличаются от программ из учебника. Я предпочитаю использовать комментарии в следующих случаях: [1] Комментарий в на |аде каждого файла исходного кода, где поясняются основные об ьявлення, делаются ссылки на литературу и приводятся наиболее важные соображения по поводу сопровождения и т, п. [2] Комментарий для каждого класса, шаблона и пространства имен. [3] Комментарий для каждой нетрпвию!ьной функции, в котором указано ее назначение, использованный алгоритм (если он не очевиден) и, может быть, предположения, которые она делает об окружении.
[4] Комментарий лля каждой глобальной переменной, переменной из пространства имен и константы. [5] Небольшие комментарии в тех местах, где код неочевиден иуили непереносим, [6] Очень редко в друпгх случаях. Например: О Э!.с: реализация п~аблицы силволов р/гключелиел!елподол~ !йусса. олс йа/в/оп: «А?!а! гоигве.,э, стр. 4 ! !. *? !) вшар [1 по,ш гает, что сгпек устроен как в 5Я //б000. *«« ««« « «*«« Сирупу/!/ (с) /99? АХИЕ /пс.
АП г! у/!!в гееегоед *«««««* ««««* * Удачно подобранный и написанный набор комментариев является существенной частью хорошей программы. Написание < правильных комментариев может оказаться не менее сложной задачей, чем написание самой программы. Стоит развивать зто искусство. Обратите внимание, что если в функции используется только //'-стиль комментариев, то любой фрагмент функции может быть «закомментирован» (временно исключен) при помощи /" */ и наоборот. 6.5. Советы [1] Отдавайте предпочтение стандартной библиотеке по отношению к другим библиотекам и коду, написанному вручную; 6 6.1.8.
[2] Избегайте слшцком сложных выражений; 9 6.2.3. [3] Если вы сомневаетесь в порядке выполнения операторов, пользуйтесь скобками; з 6.2.3. [4] Избегайте явного преобразования типов (приведения); 6 6.2.7. Глава 6. Выражения и инструкции 182 [5) Если явное преобразование типов необходимо. отдавайте предпочтение явным операторам приведения по отношению к С-подобным преобразованиям; б 6.2.7. [б) Пользуйтесь формой Т (е) только тогда, когда четко известны правила конструирования значения; 9 6.2.8. [7) Избегайте выражений с неопределенной последовательностью вычислении; ~ 6.2 2. [Я] Старайтесь не использовать до(о; 9 6,3А.
[9) Старапгссь не использовать йо-инструкцию; и 6.3.3. [1О) Ие объявляйте переменную до тех пор, пока у вас нет значения для ее инициализации; ([ 6.3.1, () 6.3.2.1, 9 63.3.1. [11) Пишите ясные и лаконичные комментарии; з 6А. [12) Придерживайтесь согласованного стиля в отступах; 6 6А. [13) Лучше определить орега(огаеш() в качестве члена класса (9 15.6), чем заменять глобальный орега1ог ссеш (); 6 6.2.6.2. [14) Всегда имейте в виду возможность «неправильного» ввода; 9 6.1.3 6.6.
Упражнения 1 (*1) Перепишите следующий пример с инструкцией 7ог в виде зквивалентного кода с использованием инструкция шус11е: уог 6=0, 1<тах 1еиитЬ, 1"-, ) с~' ,'три1 11ие[1) == ти) <1иеег соиис««, Перепилим е так, чтобы переменной цикла был указатель. то есть, чтобы проверка выглядела как-нибудь так: »р=='з'. 2. ('1) Расставьте скобки в следующих выражениях; а =- Ь + с * с( «2 8 8 а 8077'=-5 а == Ь [ а =.= с дй с < 5 с=х~ = 0 0 =1<7 7'(1, 2! «. 5 а= — 1««Ь — — 5 а=ь==с++ и = Ь= с'= 0 а[4) [2) *=*Ь з с 'с(' 2 а — Ь, с = с( 3. ('2) Введите послеловательность (возможно с символами-разделителями) пар (имя, значение), где имя является словом, отделяемым символами-разделителямн, а значение — целым или числом с плавающей точкой.
Вычислите и выведите сумму и среднее как для каждого отдельного имени, так и для всех имен (см. ф 6,1.8). 4 ( 1) Выведите таблицу результатов битовых логических операций Я 6.2.4) для всех возможных комбинаций операндов О и 1. 5. (*1.5) Приведите 5 различных конструкцин С++, смысл которых не определен (6 В.2). (*1.5) Приведите 5 различный конструкций С-+, смысл которых зависит от рва ли зал ни (6 В. 2).
183 б.б. Упражнения (<1) Приведите 10 различных примеров непереносимого кода на С'-ь. (*2) Напишите 5 выражений, в которых не определен порядок вычислений. Вы- полните их и посмотрите, что делает ваша реализация (по возможности попро- буйте примеры на нескольких реализациях). (*1.5) Что происходит при делении на 0 в вашеи системе? Что происходит при переполнении с верху и снизу? ('1) Расставьте скобки в следуюгцих выражениях: (*2) Напишите следующие функции: я(г1еп (), которая возвращает длину С-строки; я( ору (), которая копирует одну строку в другую; я(гетр (), которая сравнивает две С-строки.
Определите, какими должны быть аргументы и возвращаемые типы. Затем сравните ваши функции со стандартными библиотечными функппямц, объявленными в <ся1ппр (<к(г?пд.й>) и описанными в 9 20А.1. (*1) Послютрнте, как реагирует ваш компилятор на следуюпгие ошибки; Придумайте несколько других простых ошпоок н посмотрите, как на них реаги- рует компилятор. (*2) Модпфицпруйте пример из 9 6.6[3) таким образом, чтобы он вычислял и ме- диану. 12 (*2) Напишите функцию са( (), принимающую в качестве аргументов две С-стро- кп, которая возврщцает строку, являющуюся их конкатенацией. Воспользуйтесь оператором пеш для выделения памяти под результат. (*2) Напипгите функцию геп (), берущую в качестве аргумента символьную С-стро- ку и переставляющую в пей.символы в обратном порялке.
То есть, после вызова гео (р) последний символ р становится первым и т. д. (1.5) Что делается в слелующем примере? по1д кепд [тд Го, Гпг 7гогп,!пя сои ля) ; / Черпни ящнн. Полезные нож цен тари ° уиьииленно удалены 6. 7. 9. 10. 11. 1с 15. *Рн-~- Р ++а— йпР)Р— ьт 'Р т 'а[1) ооГд7 (?ля а,?пг Ь) (? (а=В) 0... (7 (аЪ077 ==0)?,~ ... а =5+0 ?пя и =(соипяч7) 7 В, ятисЬ (сои пЯВ) ( саяе 0 до ( 'Гон-я саяе 7 '1о++ саяе б. 'го.нсаяе 5: "го- -ь саяе 4; 'Го+я = '?сот+ ~-; = "7гот.н-; = '~готя-н-; = 7Гот.н-, = '7гот++; Глава б.
Выражения и инструкции 184 саяе 3. *го«+ = '/гааз.Н-; саяе 2 'го.н- = "1голп.н-; сазе 7 "ло«« = 'Ггот«лз ) юб!(е) — п>0), ) 16 17 18 19 20 21 22 23 Зачем кому-нибудь мо»кет понадобиться подобный код? (*2) Напишите функцию а!о?)сопя! сбаг*), которая получает С-строку, состоя- щую из цифр, и возвращает соответствующее целое значение. Например, резуль- тазом вызова а1о! )'122") должно бьлть 122. Модифицнруйте а(о! )) таким обра- зом, чтобы она могла работать с восьмеричными и шестнадцатеричными пред- ставлениями в дополнение к обычным десятичным числам. Модифицируйте а!о?() таким образом, чтобы она могла работать с символьными константами С+о.
("2) Напишите функцию !!оа )!и! л, сбаг ЬД), которая создает строковое и релстав- ление л в Ь и возвращает Ь. (*2) Введите программу калькулятора и заставьте ее работать. Не пользуйтесь командамн редактора «скопировать и вставить» прп вводе повторяющихся фраг- ментов кода. Вы научитесь большему, отыскивая и исправляя разные «мелкие глупые ошибки >. (*2) Модифнцируйте калькулятор таким образом, чтобы он выводил номер стро- ки с ошибкой. (*3) Предоставьте пользователю возможность определять функции в калькуля- торе.