Бьерн Страуструп. Язык программирования С++. Специальное издание (2011) (1004033), страница 41
Текст из файла (страница 41)
б. Редко в иных случаях. Например: 77 тЫ.с: Реализация таблицы символов. 7* Исключение методом Гаусса. См. яа!зтот "А Гтзт соиле ... "Ря 411. *7 77 взвар () предполагает раскладку стека как в оСз1 йб000. 7*********************************** Соруе)яЬ) (с) 1997 АТ&Т, 1пс. А 11 с(я)ззз гезегиед Хорошо продуманные и хорошо написанные комментарии являются неотъемлемой частью хороших программ. Написание таких комментариев столь же сложно, как и написание собственно кода программы.
Стоит развивать и культивировать искусство написания хороших комментариев. Отметим, что если в функции применяются исключительно комментарии вида 17, то целые фрагменты ее кода можно закомментировать (и быстро раскомментировать) с помощью 7* *7. При правильном кодировании на С++ подобного рода комментарии просто не нужны. Вместо них лучше полагаться на правила компоновки (59.2) и области видимости, на инициализацию и деинициализацию объектов классов (~10.4.1). Если что-то ясно выражено средствами языка, не нйдо зто повторять в комментариях.
Например: Глава б Выражения и операторы 6.5. Советы 1. Предпочитайте всем библиотекам и «самодельному коду» стандартную библиотеку; 86.1.8. 2. Избегайте слишком сложных выражений; 86.2.3. 3. Используйте круглые скобки в случае сомнений по поводу приоритетов операций; 86.2.3. 4. Избегайте явных приведений типов; 86.2.7. 5. Если явное приведение типов необходимо, используйте специфические (именованные) операции приведения вместо операций в С-стиле; 86.2.7.
6. Используйте конструкции Т(е) только тогда, когда правила конструирования четко определены; 86.2.8. 7. Избегайте выражений с неопределенным порядком вычисления; 86.2.2. 8. Избегайте применения оператора лого; 86.3.4. 9. Избегайте применения циклов 4о; 86.3.3. 10. Не объявляйте переменные до того, как станут известны инициализирующие их значения; 86.3.1, 86.3.2.1, В6.3.3.). 11. Пишите ясные и краткие комментарии; 86.4. 12. Придерживайтесь согласованного стиля отступов; Вб.4. 13. Для переопределения глобальной функции орегагог пеи() применяйте члены классов (815.6); 86.2.6.2. 14.
При чтении ввода всегда помните о возможных «сюрпризах»; Вб. [.3. 6.6. Упражнения 1. (*1) Перепишите следующий цикл 1ог в виде эквивалентного иЬ11е цикла: Гог(1=0г [<так 1епвгь; г'-';») Ц'(гири( 1(пе [1) == '? ' ) вием соил(»»г Перепишите так, чтобы проверяемой величиной был указатель и условие цикла имело вид *р=='7'. 2. (*1) Расставьте скобки в следующих выражениях: а=Ь+с*0«гав аь 077! = 3 а==Ы [а==свес<5 сея! =0 О<= 1<7 Г(1, г) «3 а= — 1««Ь--5 а=ь==с»+ а=Ь=с=о а [4) [г) *= * Ь 7 с: * 0* г а-ь, с=»( 6.6.
Упражнения 193 '~р.~"> * — -р +ча-- (ям*)р->е *р.п$ *а (1] 10. 11. гаг(1 ()п< а, ?аг Ь ) ( (7'(а43) (г'(аь077==0) а:= Ь+1) ) 12. 13. 14. 3. 5. 6. 7. 8. 9. (*2) Введите последовательность возможно разделенных пробельными символами пар (имя, значение). Имя — единственное слово, ограниченное пробельными символами. Значение формируется целым числом или числом с плавающей запятой. Вычислите и выведите сумму и среднее как для каждого отдельного имени, так и для всех имен (см. 96.1.8).
(*1) Напишите таблицу результатов всех побитовых логических операций (96.2.4) для всех возможных комбинаций операндов 0 и 1. (*1.5) Приведите 5 конструкций языка С++, смысл которых не определен (9С.2); (*1.5) Приведите 5 конструкций языка С++, смысл которых зависит от реализации (9С.2). ('1) Приведите !О примеров непереносимого кода на С++. (*2) Напишите 5 выражений, порядок вычисления которых не определен. Выполните код, чтобы посмотреть, что при этом реально делается в разных реализациях. (*1.5) Что происходит при делении на нуль в вашей системе? Что происходит при переполнении (или потере точности)? (*! ) Расставьте скобки в следукицих выражениях; (*2) Напишите следующие функции; згг1еа(), которая возвращает длину строк в С-стиле; згесру(), которая копирует содержимое одной С-строки в другую; зиссар (), которая сравнивает содержимое двух С-строк.
Решите, какого типа должны быть аргументы и возвращаемые значения. Затем сравните ваши варианты со стандартными библиотечными версиями, объявленными в <сап)аа> (<зп)аа.Ь>) и рассмотренными в 920.4.1. (*1) Проверьте, как компилятор реагирует на ошибки в следующем фрагменте: Придумайте еше несколько ошибок и проверьте реакцию компилятора на них.
(*2) Модифицируйте программу из 96.6!3], чтобы она вычисляла и медиану. ('2) Напишите функцию саг(), которая принимает в качестве аргументов две С-строки и возвращает конкатенированную С-строку. Используйте опера- цию аем для выделения памяти под результат. (*2) Напишите функцию гее() для реверсирования содержимого С-строки. Глава б, Выражения и операторы 15.
(*1.5) Что делает следующий пример? гоЫ яепй((пг* го, гпг» угот, 1пз свинг) 77 Полезные кол«иентарии улгышленно удалены. ( гпг и = (соипт7) IВ; яыбсв ( соипгг«В) ( саяе О: Ио( *го««=«угот«»; сазе 7: *го;-»вЂ” = "1гот»«; саяе 6: *со»»=»угот»»; саяе 5: *го++=»3гот««г сазе 4: *го»»=»агат»«( саяе 3: *го»«=»угот-;-; сазе 2: *го»«=»/гот»»; сазе 1: *Го««=«угот«»; )»«Ь1!е(--п>0) г Зачем кому-то может потребоваться подобный код? 16.
(*2) Напишите функцию аго1 (соим сбаг*), которая принимает С-строку, со держащую цифры и возвращает соответствующее целое. Например, для аго1 ( «123" ) должно получиться целое число 123. Модифицируйте функцию так, чтобы помимо десятичных чисел обрабатывались также восьмеричные и шестнадцатеричные. 17. ("2) Напишите функцию 1гоа(1пг г, сбаг Ь [) ), которая формирует строковое представление г в Ь и возвращает Ь. 18.
(*2) Наберите текст программы-калькулятора и заставьте его работать. Не экономьте время, применяя заранее приготовленный кем-то текст. Вы мно- гому научитесь, отыскивая и исправляя «глупые мелкие ошибки», 19. ('2) Модифицируйте программу-калькулятор, чтобы она сообщала номера строк, в которых произошла ошибка. 20. (*3) Разрешите пользователю определять функции для программы-калькуля- тора. Подсказка: определите функцию в виде последовательности операций в порядке, в котором их ввел пользователь. Последовательность можно хранить либо в виде строки, либо как список лексем. При вызове функции читайте и выполняйте этн операции. Если допускаются аргументы у пользовательских функций, придумайте соответствующую форму записи. 21. (*1.5) Модифицируйте программу-калькулятор так, чтобы вместо статических переменных питбег га1ае и зггииг га1ие использовалась структура зутбо1.
22. (*2.5) Напишите код, очищающий программу на С++ от комментариев. Пусть она читает из сги, удаляет комментарии вида ! ! и ! * * 7 и записывает результат в соиг. Не заботьтесь о внешнем виде результирующей программы (это была бы более сложная задача). Не заботьтесь о корректности программ. Не забудьте про символы ! !, !* и *7 в комментариях, строках и символьных константах. 23. (*2) Выполните просмотр ряда программ, чтобы составить представление о применяемых стилях отступов, именования и комментирования. Функции Итерация — от человека, рекурсия — от Бога.
— Л. Питер Дойч Объявления и определения функций — передача аргументов — возвращаемые значения — перегрузка функций — разрешение неоднозначностей — аргументы по умолчанию — неуказанное число аргументов — указатели на функции — мак- росы — советы — упражнения. 7.1.
Объявления функций Е!ет* пехт е)ет (); айаг* вггсру (айаг* го, сопвг айаг* (гот) го)д ек)г (Ыг); Семантика передачи аргументов идентична семантике инициализации. Производится проверка типов аргументов и при необходимости выполняется неявное приведение типов. Например: ггоиЫе вг!гг (доиЫе); // вызов ваг(() с аргументом г!оиЫе(2) // ег ог: гг)гг() требует аргумент типа г(оиЫе доиЫе вг2=вогг (2); г)оиЫе вгЗ=вогг ( вгйгеев ); Значение таких проверок и преобразований типов не следует недооценивать.
Объявления функций могут содержать имена аргументов. Это полезно программисту, читающему код, но компилятор их просто игнорирует. Как упоминалось Обычно, сделать что-либо в С++ означает вызвать функцию. Определить функцию — значит задать способ выполнения работы. Функцию нельзя вызвать, если она не была предварительно объявлена. Объявление функции Оипсг(оп дес!агапоп) предоставляет ее имя, тип возвращаемого значения (если оно есть), а также число и типы аргументов, которые требуется передавать функции при ее вызове. Например: 196 Глава 7.
Функции в 54.7 тип юЫ для возврашаемого значения функции фактически означает его от- сутствие. 7.1.1. Определения функций Любая вызываемая в программе функция должна быть где-то определена, причем лишь один раз. Определение функции (б(испол де1(и(йоп) есть ее объявление плюс тело функции. Например: ек(еги юЫ з(гор (т(», 1п(*) ( йобьявление й определение го1д з»гар ( 1и(* р, ии* (2) ( 1п( (=*р( :р»й »д — ( ) Все типы в определении функции и ее объявлениях обязаны совпадать. Однако имена аргументов совпадать не обязаны, так как они не являются частью типа, Нередки случаи, когда в определении функции часть аргументов не используется: гоЫ зеагсй ((аЫе* (, сопл( айаг» йеу, сопл( сваг» ) ( ( третий аргумент не используется ) Как показано в данном примере, неиспользуемому аргументу можно не давать имени вообще.