Искусство программирования на Си (984073), страница 9
Текст из файла (страница 9)
'"; '. "' и " "' ..., '", .*";, ', ',, )с*. 'и... 'г р,э ' „)" р ' гг",;:Гггпь ~::.'-"".,У; .По" . и й * '"*."" *...".." асг~'."'~"Х.'.=":, -" '- а Л, 'йг „и,",й,/ * ' ', йо,"','о* ' ьб =Л и','-.о",, :: —. -,:; оноэои ,Р„" 1'и. ' ..."Д).".1",*,"'% ' -",% ог ' ьпэ(,' * ', т(з,о, "',' о 1 ' и'" „пйз '.:", "г * =* ".*'-'" Л и'-- '= "':- пхг, ',-"::-- к:ф'"йод'.( -": А'!: и;" и "',*;,;-' '„р °" .': ..
' ':. ь„'"; '".,' ,,', о г"'*-" и (',р;,"," -;м,*':; ) ',э .. "Зэ 1э: —. „,,;,- -„„го -„ -: '; =-' упи ~".о::.'""':(,",'," „ьпоп* ~ !;,-'-Стой ,. "„;,.'и,„'.„.а,:.,'.„~.'" („..го ' з ' ' * »" " .' " -' »':. ' о ': '..: р ""' '" " '-"х и( ~,'":" ' р " "-:-" пап ипг ',.:„...;".;,:,:. "ып*б .**."п,, ',, ' '-,.;"'.,; о ) .",*;",':1п и ~й::г:..»':-'.тд!и: „' (-„',:-'„;:";Ь.рй.;- '.".'- о,"т ':"--,З ":- /";,и -,'-и оп " -:, п,п.'е;../г) (.' ",:.
" 'й ... ' „;„ч-"'„".*о;".' ' "Я:**';":*'*"*,.'г„"*,.ЯЪ";**"." гк ",- "-. Х ."-:ЭЭ-.'--.',":~Р~,,':ыэп';„Э.,"„Эыз;и..':-*,"Э." *,".*,', *,'".;"."..'. '.::.;". -,;=, а " ',"",', ", „' ' ' ','*", ', ( ' ' ' „'й "" " ', ', ", ',",",",о, ",. ',"'":~ П: ';-"„-:;:;,~;, :-!;,',:„4...П т г:;:-;г.;""СГ;""' ':: Г~,*. 'аГа..:.:":. *: г'.""пн ".';„.'.( „.„', (,"; , '',, О.*:.го.* К"'.1.';*,".... Проблема снабжения кода символами комментариев Комментирование сложного кода (закомментирование) состоит в том, что трудно закомментировать его вдоль и поперек. Поскольку С не.лоОднако иногда требуется задокументировать механизм пускает наличия вложенных комментариев, использореализации той или иной операции.
Лучше всего писать ванне символов комментариев для закрытия кода, самый простой код, но иногда невозможно совместить содержащего комментарии, может стать поистине испыпростоту со скоростью кодирования. Когда вы пишете танием терпения. Повторное включение кода в програмсложный код, думайте о программисте сопровождения му также является болезненным, поскольку вам нужно 3:"-'1 ~.„.'пг -'!.о Р",.„,!;-' н;: '!, и„", "' па и:па ."-",. " Р.':: Г ~-'-':;П ="";: . ...~,ьп' "-"; . опп*,. оп "*( 1 нне)ч( Война етандартов програчмирования.
причини и нута перемирия Пересмотрен нмй яяия С Глава 2 Чвсзь ! определит, успешно ли завершилась программа. если вы не сообшите ему об этом? Этот вызов "сидит" где-то глубоко во внутренностях системы (здесь я немного упростил его): Ересь )(оЫ В)а(п О Если вы "опустошите" ф>нкцию ша!и (), появится несколько интересных возможностей: ° Программа может работать в точности так, как вы ожидаете.
° гешгаа1а1па может попасть в ловушку и вызвать аварийный отказ программы (либо всего компьютера) ° Код запуска может отправить поддельный код возврата операционной системе, которая затем решит перемотать назад транзакции базы данных, поскольку программа не возвратила ожидаемого значения. Общие ошибки и недоразумения Слелуюшие несколько разделов охватывают некоторые разнообразные обычные в С-программировании ошиб- ки и недоразумения.
Функция епап О возвращает тип !пт. Если вы уже это знаете, можете при желании сразу перейти к следуюшему разделу. Если вы присвоите функции пзаш () тип возврата, отличный от !пт, то в компиляторах, предшествующих компиляторам С99, вы получите неопределенное поведение своей программы. В компиляторах С99 вы получите неспецифицированное поведение, если так говорит реализапия версии, или неопределенное поведение— если она этого не делает. Доверяете ли вы своей программе в этом отношении? Многие просто не верят мне, когда я говорю им это ание завершения, возвращаемое в хост-среду, явля ется неспецифицированным".
В данном контексте "неспецифицированный" означает, что стандарт не требует какого-либо специфического поведения от компилятора, который волен возвратить в хост-среду (обычно это операционная система) любое состояние, какое ему нравится, и это применяется, только если документами реяли(ации установлено, что она поддерживает возврашаечмые из ша!я О типы, отличные от !пг. Если у вас пустая (ио!е!) главная функция шаги О и вы пишете код для ядерного реактора нли военного самолета, вы, возможно, почувствуете легкую нерешительность, и я не виню вас. Кроме того, определение ша!в О для возврата типа то!й (пустой) не яатяется синтаксической ошибкой или нарушением ограничения, так что компилятор не обязательно должен вылавагь какое-либо диагностическое сообшение.
Давайте посмотрим на это несколько под иным угЛОМн РаССМОтпе(М Лстасотмй. аРР Мсит„, ФУВКЦИИ,,СОПГИа яве гвепгпвевевв, гвесгпвевесв = твав (вгдс, ведя] ° А это ху:ке всего — код запуска может снаружи до стигнуть вашего носа и начать извлекать из негр де определений. Они разрешены только для компиляторов, которгае документируют эти альтернативные формы и которые конечно же не включают всех компиляторов. Ниже приведены переносимые определения функции шаеп Ел ° 'шг гпа!п (но(г!) ° !и! гпаш (!пг агбс, сйаг "агбн) ° !пг ша(п (!пг агяс, сваг ннагят ! ! ) ° Любое определение, в точности эквивалентное лю бому из трех предыдуших Таким образом, вы можете использовать различные имена переменных в качестве агкс и агйт, а также мохеете использовать РОО, если определению предшествует гуре!(е! !п1 ЕОО, и т.д. Но чтобы возвращаемое значение было переносимым, из ша!п вы должны возврашать тип !п1, а также задавать либо ни одного аргумента, либо два специфицированных стандартом аргумента.
Если есть необходимость получить доступ к Пере .мотре и~ «д яяые С тши и от а яда ртоа программ иро«опия: при чаи«и пути пере чирия Часть! Глава 2 влпхйлес1 сваг с; На практике многие программы используют сигна- Это говорит о том, что модификация р функцией Аналогично, если вам необходимо изменить пере- 11 ((гвад (Ьс, 1, 1, гр) > О) ( лы, и не только для перехватывания прерываний при (всгешеп( () не оказала влияния на первоначальный ука- менную рр( на тип **Т (где Т является некоторым ти/* ... */ операциях с плавающей точкой.
Например, сигналы затель з. Именно такого поведения мы и ожидали при пом), вам нужно передать трр( в свою функцию, кото- часто используются в сетевых (/К1Х-приложениях. Мое передаче по значению. 11о этой же причине следующии р бы а бы прототипирована например так Единственный способ, позволяющий определить мнение таково, что такое использование основано на код работать не булет (и фактически проявит неопреэто, состоит в том, чтобы запустить ее и смотреть. Даже реализации, разрешающей и поддерживающей его, так б ( Ф 1лс оо (т **и рррт) г деленное повеление) когда вы сделаете это, ваши результаты не будут пере- что вы должны быть осторожны.
(Строго говоря, вы (В действительности это может принять лаже более носимыми на другой компьютер, опер ционную сис - нцзсет ь на неопрепеленное поведение, но если вагц 01лс1веге <пежо. ь> глупый вид, чем то, что написано злесь. Сначала я хому или реализацию (или даже на лругую версию олно- поставщик задокументировал поведение и вы можете тел было использовать здесь пачь звездочек, как в од1вг орел(11в(еьаг 'а, 01ЬЕ 'гр) го и того же компилятора).
Имеет смысл инвестировать доверять ему, у вас все должно быль в порядке, по край( ном реальном коде. К счастью, такое требуется редко.) капитал в хороший кодовый профайлер, если для ваше- ней мере пока не будет реализована следующая версия (р = 1орвл(а, 'г')1 го приложения эффективность является ключевым ас- вашего компилятора.) гогвга (р 2 1 : 01 Проблемы с включающим ИЛИ пектом. (Если эффективность не важна для вашего при- ) Некоторые компьютеры хранят числа таким образом, ложения, почему тогда вы в первую очередь озабочены ПЮРВДВЧВ ПО ЗНЗЧВНИЮ 101 ва1а(чохй) что первым следует наиболее значимый байт.
Говорят, этим?) Для большинства приложений вопросы эффекМы все знаем, что не можем делать перестановку (или ( что такие компьютеры имеют порядок хранения "от тивности возникают только тогда, когда программа высвапирование) двух типов шг с помощью функции, по'гр; старшего к мчадшему" (Ь(я-елд(ап). В других компьютеполняется полобно тому, как бежит одноногая собака.
сЬаг Ьаггвг(10241; добной этой: лах первым следует наименее значимыи баит (1пг(е- В этих обстоятельствах вы, вероятнее всего, захотите 1.1(орвв111в( гвадвв*, 1Р)) получить значительный выигрыш в эффективности пу- чаха омар (хле в, 1ле ь) ( епд(ап), поскольку такое расположенве оказывается ( вьх1е((йега(Ьвггвг агава( ьвггег гр) ) более эффективным для их конкретной архитектуры тем пересмотра своего выбора алгоритма, а не путем :,:тд;;;дче:;ьи Ьге :л ь.' -"$".и ..;-.;.„',Рр( (В" о~...
'*,.',. г "р "' -," .„, "'. Ьь чп "," е" "'.,' ';...""' . ' ' „.. э еи,, ",::, ... „е „"' °;'..., ' '"' ';жь::"т ',."':,'" "-' .', „'' печ) з., о;...1:"ьо: ",: з 1 зг,,'"; ": ..";, '"' ь ' ": "'„"' " "",,';."'" ... «,о"„.,Е " '~„,' еьз .гл""„'...";,1'"",.;... ~;-В ';!~че .й;--",)з *",„;1 ".Хя;*.и'-о„;;,,',"'о '-',";,"*.,*,'"*;-'"„.!а-'-';",и, '„~."",';',;..""' оЬ!,"*.,";;.,",,„:;"';;!'-.'"';ч *':,",.„":.*„'..„- -,""'с) „:!,:;.„~~)*',"'!';;.';;:~";-"„:"*'„",;;:"'-","',.~;"*:„з й(',,":!"' т' *,~.* „";, ~.,':„...';:"= у )0~;;*( Ву, !,:.г,, х ~'й бе,";о язг ' '„',' ' ', го ',~,'':*,:' ,":.',~.„!,ур".,"";,'~;*~-;;." яе,::~.-:":-,'",' :-.'т ЗРО),.'~; 1;.,",т 1 1; (,.~,.;,"-;-;; -'.-:: Ча);:;",:;->ч;::'Ч -':,-'~т ",: фй ',,';: Ф„'-,е;,:,,'"'",'";:,т ';"'.=:";,, '.;„",!.";,'(~~;;:,::;) „', г!'""з Г!- „:-;- -;.Кд и)!Ьйл.д,;.-.ЙЬ:,,::-::,':; Ь(' "; '"' э Я;."' то -~-.-'-„.,~:.'":".'~ жь,, и";- ° //ерегмынренный язык с Часть 1 Войны стандартов гроеромнцювонин: иринины и нути нереиирин Глава 2 Неьао 1б а=Ь=аьЬ тго16 втггеи(сЬаг нв) ( зве 1еп — всг1еа(в)1 С точки зрения стандарта С эта программа может выполнять любые функции.