246071-Либерти-Освой-самостоятельно-С-за-21-день (Освой С++ самостоятельно за 1 день. Книга), страница 13
Описание файла
PDF-файл из архива "Освой С++ самостоятельно за 1 день. Книга", который расположен в категории "". Всё это находится в предмете "объектно-ориентированное программирование (ооп)" из 2 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 13 страницы из PDF
В языке C++ можно поместить одну и ту жепеременнуюпообестороныоператораприсваивания,итогдапредыдущийблоксведетсялишькодномувыражению:myAge=myAge+2;В алгебре это выражение рассматривалось бы как бессмысленное, но в языке C++ оночитается следующим образом: добавить два к значению переменной myAge и присвоитьрезультатпеременнойmyAge.Существуетещеболеепростойвариантпредыдущейзаписи,хотяеготруднеечитать:myAge+=2;Этот оператор присваивания с суммой (+=) добавляет r-значение к l-значению, а затемсновазаписываетрезультатвl-значение.ЕслибыдоначалавыполнениявыраженияпеременнаяmyAgeимелазначение4,топослееевыполнениязначениепеременнойmyAgeсталобыравным6.Помимо оператора присваивания с суммой существуют также оператор присваивания свычитанием(-=),делением(/=),умножением(*=)иделениемпомодулю(%=).ИнкрементдекрементОчень часто в программах к переменным добавляется (или вычитается) единица.
В языкеC++увеличениезначенияна1называетсяинкрементом,ауменьшениена1—декрементом.Дляэтихдействийпредусмотреныспециальныеоператоры.Операторинкремента(++)увеличиваетзначениепеременнойна1,аоператордекремента(-)уменьшаетегона1.Так,еслиувасестьпеременнаяСивыхотитеприраститьеенаединицу,используйтеследующеевыражение:C++;//УвеличениезначенияСнаединицуЭтожевыражениеможнобылобызаписатьследующимобразом:С=С+1;что,всвоюочередь,равносильновыражению.С+=1;ПрефиксипостфиксКак оператор инкремента, так и оператор декремента работает в двух вариантах:префиксном и постфиксном. Префиксный вариант записывается перед именем переменной(++myAge),апостфиксный—посленего(myAge++).В простом выражении вариант использования не имеет большого значения, но в сложномпри выполнении приращения одной переменной с последующим присваиванием результатадругой переменной это весьма существенно.
Префиксный оператор вычисляется доприсваивания,апостфиксный—после.Семантика префиксного оператора следующая: инкрементируем значение, а затемсчитываем его. Семантика постфиксного оператора иная: считываем значение, а затемдекрементируеморигинал.Напервыйвзглядэтоможетвыглядетьнесколькозапутанным,нопримерылегкопроясняютмеханизм действия этих операторов. Если x — целочисленная переменная, значение которойравно5,и,знаяэто,вызаписалиintа=++x;тотемсамымвелеликомпиляторуинкрементироватьпеременнуюx(сделавееравной6),азатем присвоить это значение переменной а. Следовательно, значение переменной а теперьравно6изначениепеременнойxтожеравно6.Еслиже,послеэтоговызаписалиintb=x++;тотемсамымвелеликомпиляторуприсвоитьпеременнойbтекущеезначениепеременнойx(6), а затем вернуться назад к переменной x и инкрементировать ее.
В этом случае значениепеременной b равно 6, но значение переменной x уже равно 7. В листинге 4.4продемонстрированоиспользованиеобоихтиповоператоровинкрементаидекремента.Листинг4.4.Примерыиспользованияпрефиксныхипостфиксныхоператоров1://Листинг4.4.Демонстрируетиспользование2://префиксныхипостфиксныхоператоров3://инкрементаидекремента4:#include<iostream.h>5:intmain()6:{7:intmyAge=39;//инициализируемдвецелочисленныепеременные8:intyourAge=39;9:cout<<"Iam:"<<myAge<<"yearsold.\n";10:cout<<"Youare:"<<yourAge<<"yearsold\n";11:myAge++;//постфиксныйинкремент12:++yourAge;//префиксныйинкремент13:cout<<"Oneyearpasses...\n";14:cout<<"Iam:"<<myAge<<"yearsold.\n";15:cout<<"Youare:"<<yourAge<<"yearsold\n";16:cout<<"Anotheryearpasses\n";17:cout<<"Iam:"<<myAge++<<"yearsold.\n";18:cout<<"Youare:"<<++yourAge<<"yearsold\n";19:cout<<"Let'sprintitagain.\n";20:cout<<"Iam:"<<myAge<<"yearsold.\n";21:cout<<"Youare:"<<yourAge<<"yearsold\n";22:return0;23:}Результат:Iam39yearsoldYouare39yearsoldOneyearpassesIam40yearsoldYouare40yearsoldAnotheryearpassesIam40yearsoldYouare41yearsoldLet'sprintitagainIam41yearsoldYouare41yearsoldАнализ: В строках 7 и 8 объявляются две целочисленные переменные и каждая из нихинициализируетсязначением39.Значенияэтихпеременныхвыводятсявстроках9и10.В строке 11 инкрементируется переменная myAge с помощью постфиксного оператораинкремента, а в строке 12 инкрементируется переменная yourAge с помощью префиксногооператораинкремента.Результатыэтихоперацийвыводятсявстроках14и15;каквидите,ониидентичны(обоимучастникамнашегоэкспериментапо40лет).В строке 17 инкрементируется переменная myAge (также с помощью постфиксногооператораинкремента),являясьприэтомчастьювыражениявыводанаэкран.Посколькуздесьиспользуетсяпостфикснаяформаоператора,тоинкрементвыполняетсяпослеоперациивывода,поэтомусновабыловыведенозначение40.Затем(длясравненияспостфикснымвариантом)встроке 18 инкрементируется переменная yourAge с использованием префиксного оператораинкремента.
Эта операция выполняется перед выводом на экран, поэтому отображаемоезначениеравночислу41.Наконец,встроках20и21этижезначениявыводятсяснова.Посколькуприращениябольшене выполнялись, значение переменной myAge сейчас равно 41, как и значение переменнойyourAge(всеправильно:старееммывсесодинаковойскоростью!).ПриоритетыоператоровКакоедействие—сложениеилиумножение—выполняетсяпервымвсложномвыражении,напримервтаком,какэто:X=5+3*8;Если первым выполняется сложение, то ответ равен 8 * 8, или 64. Если же первымвыполняетсяумножение,тоответравен5+24,или29.Каждый оператор имеет значение приоритета (полный список этих значений приведен вприложенииА).Умножениеимеетболеевысокийприоритет,чемсложение,поэтомузначениеэтого"спорного"выраженияравно29.Еслидваматематическихоператораимеютодинитотжеприоритет,тоонивыполняютсявпорядкеследованияслеванаправо.Значит,ввыраженииX=5+3+8*9+6*4;сначалавычисляетсяумножение,причемслеванаправо:8*9=72и6*4=24.Теперьтожевыражениевыглядитпроще:x=5+3+72+24;Затемвыполняемсложение,тожеслеванаправо:5+3=8;8+72=80;80+24=104.Однакобудьтеосторожны—невсеоператорыпридерживаютсяэтогопорядкавыполнения.Например,операторы присваивания вычисляются справа налево! Но что же делать, если установленныйпорядокприоритетовнеотвечаетвашимнамерениям?Рассмотримвыражение:TotalSeconds=NumMinutesToThink+NumMinutesToType*60Предположим, что в этом выражении вы не хотите умножать значение переменнойNumMinutesToType на число 60, а затем складывать результат со значением переменнойNumMinutesToThink.
Вам нужно сначала сложить значения двух переменных, чтобы получитьобщее число минут, а затем умножить это число на 60, получив тем самым общее количествосекунд.В этом случае для изменения порядка выполнения действий, предписанного приоритетомоператоров, нужно использовать круглые скобки. Элементы, заключенные в круглые скобки,имеют более высокий приоритет, чем любые другие математические операторы.
Поэтому дляреализациивашихнамеренийприведенноевышевыражениенужнопредставитьвтакомвиде:TotalSeconds=(NumMinutesToThink+NumMinutesToType)*60ВложениекруглыхскобокПри создании сложных выражений может возникнуть необходимость вложить круглыескобки друг в друга. Например, вам нужно вычислить общее число секунд, затем общее числовключенныхврассмотрениелюдей,аужпотомперемножитьэтичисла:TotalPersonSeconds=(((NumMinutesToThink+NumMinutesToType)*60)*(PeopleInTheOffice+PeopleOnVacation))Это сложное выражение читается изнутри. Сначала значение переменнойNumMinutesToThink складывается со значением переменной NumMinutesToType, поскольку онизаключены во внутренние круглые скобки.
Затем полученная сумма умножается на 60. Послеэтого значение переменной PeopleInTheOffice прибавляется к значению переменнойPeopleOnVacation. Наконец, вычисленное общее количество людей умножается на общее числосекунд.Этотпримерзатрагиваетблизкуюинеменееважнуютему.Приведенноевышевыражениелегко вычисляется компьютером, но нельзя сказать, что человеку его так же легко читать,пониматьимодифицировать.Воткакможнопереписатьэтовыражениеспомощьювременныхцелочисленныхпеременных:TotalMinutes = NumMinutesToThink + NumMinutesToType; TotalSeconds = TotalMinutes * 60;TotalPeople = PeopleInTheOffice + PeopleOnVacation; TotalPersonSeconds = TotalPeople *TotalSeconds;Для записи этого варианта требуется больше времени и много временных переменных, ноон гораздо легче для понимания.
Осталось лишь добавить комментарии, разъясняющиеназначение этого программного кода, и заменить число 60 символьной константой. И тогдаможносчитатьэтотпрограммныйфрагментпрактическиидеальнымдлячтенияидальнейшейэксплуатации.Рекомендуется:Помните, что выражения оперируют значениями. Используйтепрефиксный оператор (++переменная) для инкремента или декремента переменной перед ееиспользованием в выражении.
Используйте постфиксный оператор (переменная++) дляинкремента или декремента переменной после ее использования в выражении. Используйтекруглые скобки для изменения порядка выполнения операторов, обусловленного ихприоритетами.He рекомендуется:Не используйте слишком много вложенных круглых скобок, посколькутакиевыражениястановятсятруднымидляпонимания.ЧтотакоеИСТИННОВ предыдущих версиях языка C++ результаты логических выражений представлялисьцелочисленнымизначениями,новновомстандартеANSIвведенновыйтип—bool,имеющийтолькодвавозможныхзначения:trueилиfalse.Любоевыражениеможетбытьрассмотреносточкизренияегоистинностиилиложности.Математическиевыражения,возвращающиенуль,можноиспользоватьдляприсвоениязначенияfalseлогическойпеременной,алюбойдругойрезультатбудетозначатьtrue.Примечание:Многиекомпиляторыираньшебылисориентированынатипbool,которыйвнутренне представлялся с помощью типа long int и поэтому имел размер, равный четырембайтам.НынеANSI-совместимыекомпиляторычастообеспечиваютоднобайтовыйтипbool.ОператорыотношенийТакие операторы используются для выяснения равенства или неравенства двух значений.Выражения сравнения всегда возвращают значения true (истина) или false (ложь).
Операторыотношенияпредставленывтабл.4.1.Примечание:В новом стандарте ANSI предусмотрен новый тип bool, и все операторыотношенийтеперьвозвращаютзначениетипаbool—trueиfalse.ВпредыдущихверсияхязыкаC++этиоператорывозвращали0вкачествеfalseилилюбоененулевоезначение(обычно1)вкачествеtrue.ЕслиоднацелочисленнаяпеременнаяmyAgeсодержитзначение39,адругаяцелочисленнаяпеременнаяyourAge—значение40,то,используяоператорравенства(==),можноузнать,равнылиэтипеременные:myAge == yourAge; // совпадает ли значение переменной myAge со значением переменнойyourAge?Это выражение возвращает 0, или false (ложь), поскольку сравниваемые переменные неравны.ВыражениеmyAge > yourAge; // значение переменной myAge больше значения переменной yourAge?такжевозвратит0(илиfalse).Предупреждение:МногиеначинающиепрограммироватьнаязыкеC++путаютоператорприсваивания (=) с оператором равенства (==). Случайное использование не того оператораможетпривестиктакойошибке,которуютруднообнаружить.Всего в языке C++ используется шесть операторов отношений: равно (==), меньше (<),больше(>),меньшеилиравно(<=),большеилиравно(>=)инеравно(!=).Втабл.4.1нетолькоперечисленывсеоператорыотношений,ноиприведеныпримерыихиспользования.Рекомендуется:Помните,чтооператорыотношенийtrueилиfalse.Heрекомендуется:Непутайтеоператорприсваивания(=)соператоромравенства(==).Это одна из самых распространенных ошибок программирования на языке C++ — будьтеначеку!Таблица4.1.ОператорыотношенийОператорifОбычно программа выполняется по порядку, строка за строкой.