Ц ++

Категорија израза Таксономија у језику Ц ++

Категорија израза Таксономија у језику Ц ++

Прорачун је било која врста израчунавања која следи добро дефинисан алгоритам. Израз је низ оператора и операнда који специфицира прорачун. Другим речима, израз је идентификатор или литерал, или секвенца оба, којима се придружују оператори.У програмирању, израз може резултирати вриједношћу и / или проузроковати нека дешавања. Када резултира вредношћу, израз је глвалуе, рвалуе, лвалуе, квалуе или првалуе. Свака од ових категорија је скуп израза. Сваки скуп има дефиницију и посебне ситуације у којима његово значење превладава, разликујући га од другог скупа. Сваки скуп назива се вредносном категоријом.

Белешка: Вредност или литерал је и даље израз, па ови термини класификују изразе, а не заправо вредности.

глвалуе и рвалуе су две подскупове из израза великог скупа. глвалуе постоји у још два подскупа: лвалуе и квалуе. рвалуе, други подскуп за израз, такође постоји у два следећа подскупа: квалуе и првалуе. Дакле, квалуе је подскуп и глвалуе и рвалуе: то јест, квалуе је пресек и глвалуе и рвалуе. Следећи дијаграм таксономије, преузет из спецификације Ц ++, илуструје однос свих скупова:

првалуе, квалуе и лвалуе су вредности примарне категорије. глвалуе је унија лвалуес и квалуес, док је рвалуес унија квалуес и првалуес.

Потребно вам је основно знање на језику Ц ++ да бисте разумели овај чланак; такође је потребно знање о опсегу у Ц++.

Садржај чланка

Основе

Да бисте заиста разумели таксономију категорија израза, прво морате да се сетите или знате следеће основне карактеристике: локација и објекат, складиште и ресурс, иницијализација, идентификатор и референца, референце лвалуе и рвалуе, показивач, слободно складиштење и поновна употреба ресурс.

Локација и објекат

Узмите у обзир следећу изјаву:

инт идент;

Ово је декларација која идентификује локацију у меморији. Локација је одређени скуп узастопних бајтова у меморији. Локација се може састојати од једног бајта, два бајта, четири бајта, шездесет четири бајта итд. Локација целог броја за 32-битну машину је четири бајта. Такође, локација се може идентификовати помоћу идентификатора.

У горњој декларацији, локација нема никакав садржај. То значи да нема никакву вредност, јер је садржај вредност. Дакле, идентификатор идентификује локацију (мали непрекидни простор). Када се локацији додели одређени садржај, идентификатор тада идентификује и локацију и садржај; односно идентификатор тада идентификује и локацију и вредност.

Размотрите следеће изјаве:

инт идент1 = 5;
инт идент2 = 100;

Свака од ових изјава је декларација и дефиниција. Први идентификатор има вредност (садржај) 5, а други идентификатор вредност 100. У 32-битној машини, свака од ових локација дуга је четири бајта. Први идентификатор идентификује и локацију и вредност. Други идентификатор такође идентификује обоје.

Објекат је именовано подручје складиштења у меморији. Дакле, објекат је или локација без вредности или локација са вредношћу.

Складиштење објеката и ресурси

Локација објекта се назива и складиште или ресурс објекта.

Иницијализација

Размотрите следећи сегмент кода:

инт идент;
идент = 8;

У првом реду се објављује идентификатор. Ова декларација пружа локацију (складиште или ресурс) за целобројни објекат, идентификујући га са именом, идент. Следећи ред ставља вредност 8 (у битовима) на место идентификовано идент. Стављање ове вредности је иницијализација.

Следећа изјава дефинише вектор са садржајем, 1, 2, 3, 4, 5, идентификован втр:

стд :: вецтор втр 1, 2, 3, 4, 5;

Овде се иницијализација са 1, 2, 3, 4, 5 врши у истој изјави дефиниције (декларације). Оператор доделе се не користи. Следећа изјава дефинише низ са садржајем 1, 2, 3, 4, 5:

инт арр [] = 1, 2, 3, 4, 5;

Овај пут је за иницијализацију коришћен оператор додељивања.

Идентификатор и референца

Размотрите следећи сегмент кода:

инт идент = 4;
инт & реф1 = идент;
инт & реф2 = идент;
цоут<< ident <<"<< ref1 <<"<< ref2 << '\n';

Излаз је:

4 4 4

идент је идентификатор, док су реф1 и реф2 референце; упућују на исту локацију. Референца је синоним за идентификатор. Уобичајено, реф1 и реф2 су различита имена једног објекта, док је идент идентификатор истог објекта. Међутим, идент се и даље може назвати именом објекта, што значи да идент, реф1 и реф2 именују исто место.

Главна разлика између идентификатора и референце је у томе што се, када се проследи као аргумент функцији, ако се прослеђује помоћу идентификатора, направи копија за идентификатор у функцији, док се ако се проследи референцом, иста локација користи у оквиру функцију. Дакле, прослеђивање идентификатора завршава на две локације, док прослеђивање референце завршава на истој локацији.

референца лвалуе и референца рвалуе

Уобичајени начин стварања референце је следећи:

инт идент;
идент = 4;
инт & реф = идент;

Прво се лоцира и идентификује складиште (ресурс) (са именом као што је идент), а затим се направи референца (са именом као што је реф). Када се функција прослеђује као аргумент, у функцији ће се направити копија идентификатора, док ће се у случају референце користити (на коју се односи) оригинална локација у функцији.

Данас је могуће само имати референцу без њене идентификације. То значи да је могуће прво створити референцу без да имате идентификатор локације. Ово користи &&, као што је приказано у следећој изјави:

инт && реф = 4;

Овде нема претходне идентификације. Да бисте приступили вредности објекта, једноставно користите реф као што бисте користили горе наведени идент.

Са && декларацијом не постоји могућност просљеђивања аргумента функцији помоћу идентификатора. Једини избор је да прођете референцом. У овом случају, унутар функције се користи само једно место, а не друго копирано место као код идентификатора.

Референтна декларација са & назива се лвалуе референце. Референтна декларација са && назива се рвалуе референце, која је уједно и референца првалуе (погледајте доле).

Поинтер

Узмите у обзир следећи код:

инт птдИнт = 5;
инт * птрИнт;
птрИнт = &ptdInt;
цоут<< *ptrInt <<'\n';

Излаз је 5.

Овде је птдИнт идентификатор попут идентитета горе. Овде су два објекта (локације) уместо једног: шиљати објекат, птдИнт идентификован птдИнт, и објекат показивача, птрИнт идентификован птрИнт. & птдИнт враћа адресу истакнутог објекта и ставља је као вредност у показивач птрИнт објекта. Да бисте вратили (прибавили) вредност истакнутог објекта, користите идентификатор објекта показивача, као у „* птрИнт“.

Белешка: птдИнт је идентификатор, а не референца, док је претходно поменуто име реф, референца.

Други и трећи ред у горњем коду могу се свести на један ред, што доводи до следећег кода:

инт птдИнт = 5;
инт * птрИнт = &ptdInt;
цоут<< *ptrInt <<'\n';

Белешка: Када се показивач повећа, он показује на следећу локацију, што није додавање вредности 1. Када се показивач смањи, он показује на претходну локацију, што није одузимање вредности 1.

Бесплатна продавница

Оперативни систем додељује меморију за сваки покренут програм. Меморија која није додељена ниједном програму позната је као бесплатна продавница. Израз који враћа локацију за цео број из бесплатне продавнице је:

нови инт

Ово враћа локацију за цео број који није идентификован. Следећи код илуструје како се користи показивач у бесплатној продавници:

инт * птрИнт = ново инт;
* птрИнт = 12;
цоут<< *ptrInt  <<'\n';

Излаз је 12.

Да бисте уништили објекат, користите израз делете на следећи начин:

делете птрИнт;

Аргумент израза делете је показивач. Следећи код илуструје његову употребу:

инт * птрИнт = ново инт;
* птрИнт = 12;
делете птрИнт;
цоут<< *ptrInt <<'\n';

Излаз је 0, а не нешто попут нуле или недефинисаног. делете замењује вредност локације са подразумеваном вредношћу одређеног типа локације, а затим дозвољава локацију за поновну употребу. Подразумевана вредност за инт локацију је 0.

Поновно коришћење ресурса

У таксономији категорија израза, поновна употреба ресурса је исто што и поновна употреба локације или складишта за објекат. Следећи код илуструје како се локација из бесплатне продавнице може поново користити:

инт * птрИнт = ново инт;
* птрИнт = 12;
цоут<< *ptrInt <<'\n';
делете птрИнт;
цоут<< *ptrInt <<'\n';
* птрИнт = 24;
цоут<< *ptrInt <<'\n';

Излаз је:

12
0
24

Вредност 12 се прво додељује неидентификованој локацији. Тада се садржај локације брише (у теорији се брише објекат). Вредност 24 се поново додељује истој локацији.

Следећи програм показује како се поново користи целобројна референца коју враћа функција:

#инцлуде
коришћење простора имена стд;
инт & фн ()

инт и = 5;
инт & ј = и;
ретурн ј;

инт маин ()

инт & миИнт = фн ();
цоут<< myInt <<'\n';
миИнт = 17;
цоут<< myInt <<'\n';
ретурн 0;

Излаз је:

5
17

Објект као што је и, декларисан у локалном опсегу (опсег функције), престаје да постоји на крају локалног опсега. Међутим, функција фн () изнад даје референцу и. Кроз ову враћену референцу, име миИнт у функцији маин (), поново користи локацију идентификовану и за вредност 17.

Вредност

Лвалуе је израз чија процена одређује идентитет објекта, бит-поља или функције. Идентитет је званични идентитет као што је горе наведени идент, или референчно име лвалуе, показивач или име функције. Размотрите следећи код који ради:

инт миИнт = 512;
инт & миРеф = миИнт;
инт * птр = &myInt;
инт фн ()

++птр; --птр;
ретурн миИнт;

Овде је миИнт вредност; миРеф је референтни израз лвалуе; * птр је израз лвалуе јер се његов резултат може идентификовати са птр; ++ птр или -птр је израз лвалуе јер је његов резултат могуће идентификовати са новим стањем (адресом) птр, а фн је лвалуе (израз).

Размотрите следећи сегмент кода:

инт а = 2, б = 8;
инт ц = а + 16 + б + 64;

У другој изјави, локација за 'а' има 2 и може се идентификовати са 'а', па тако и лвалуе. Локација за б има 8 и може се идентификовати са б, а такође је и вредност. Локација за ц имаће збир, а може се идентификовати са ц, а исто тако и вредност. У другој изјави изрази или вредности 16 и 64 су рвалуе (види доле).

Размотрите следећи сегмент кода:

цхар сек [5];
сек [0] = 'л', сек [1] ​​= 'о', сек [2] = 'в', сек [3] = 'е', сек [4] = '\ 0';
цоут<< seq[2] <<'\n';

Излаз је 'в';

сек је низ. Локација 'в' или било која слична вредност у низу идентификована је помоћу сек [и], где је и индекс. Дакле, израз сек [и] је израз вредности. сек, који је идентификатор читавог низа, такође је вредност.

првалуе

Првалуе је израз чија процена иницијализује објекат или битно поље или израчунава вредност операнда оператора, како је одређено контекстом у којем се појављује.

У изјави,

инт миИнт = 256;

256 је прва вредност (израз прва вредност) која иницијализује објекат који је идентификовао миИнт. На овај објекат се не упућује.

У изјави,

инт && реф = 4;

4 је прва вредност (израз прва вредност) која иницијализује објекат на који се реф. Овај објекат није званично идентификован. реф је пример референтног израза рвалуе или референтног израза првалуе; то је име, али не и званични идентификатор.

Размотрите следећи сегмент кода:

инт идент;
идент = 6;
инт & реф = идент;

6 је прва вредност која иницијализује објекат идентификован идент; на објекат се такође реф. Овде је референца референца лвалуе, а не референца првалуе.

Размотрите следећи сегмент кода:

инт а = 2, б = 8;
инт ц = а + 15 + б + 63;

15 и 63 су константа која израчунава за себе, стварајући операнд (у битовима) за оператер сабирања. Дакле, 15 или 63 је израз прве вредности.

Било који литерал, осим литералног низа, је прва вредност (тј.е., израз прве вредности). Дакле, буквално као што је 58 или 58.53, или тачно или нетачно, прва је вредност. Литерал се може користити за иницијализацију објекта или би израчунао за себе (у неки други облик у битовима) као вредност операнда за оператора. У горњем коду, литерал 2 иницијализује објекат, а. Такође се израчунава као операнд за оператер доделе.

Зашто стринг литерал није прва вредност? Узмите у обзир следећи код:

цхар стр [] = "љубав не мржња";
цоут << str <<'\n';
цоут << str[5] <<'\n';

Излаз је:

љубав не мржња
н

стр идентификује цео низ. Дакле, израз стр, а не оно што идентификује, је вредност. Сваки знак у низу може се идентификовати са стр [и], где је и индекс. Израз стр [5], а не карактер који идентификује, представља вредност. Знаковни низ је вредност лв, а не прва вредност.

У следећој изјави, литерал низа иницијализује објекат, арр:

птрИнт ++ или птрИнт-- 

Овде је птрИнт показивач на целобројну локацију. Цео израз, а не коначна вредност локације на коју упућује, је прва вредност (израз). То је зато што израз, птрИнт ++ или птрИнт-, идентификује првобитну прву вредност своје локације, а не другу коначну вредност исте локације. С друге стране, -птрИнт или -птрИнт је вредност, јер идентификује једину вредност интереса на локацији. Други начин на који се на то гледа је да оригинална вредност израчунава другу коначну вредност.

У другој изјави следећег кода, а или б и даље се могу сматрати првом вредношћу:

инт а = 2, б = 8;
инт ц = а + 15 + б + 63;

Дакле, а или б у другој изјави је вредност јер идентификује објекат. Такође је прва вредност јер израчунава цели број операнда за оператор сабирања.

(нев инт), а не локација коју успоставља је прва вредност. У следећој изјави, повратна адреса локације додељује се показивачком објекту:

инт * птрИнт = ново инт

Овде је * птрИнт вредност, док је (нев инт) прва вредност. Запамтите, вредност или прва вредност је израз. (нев инт) не идентификује ниједан објекат. Враћање адресе не значи идентификовање објекта са именом (као што је идент, горе). У * птрИнт, име, птрИнт, је оно што стварно идентификује објекат, тако да је * птрИнт вредност. С друге стране, (нев инт) је прва вредност, јер израчунава нову локацију на адресу вредности операнда за оператор доделе =.

квалуе

Данас лвалуе означава вредност локације; првалуе је кратица за „чисту“ вредност (погледајте шта значи рвалуе у наставку). Данас квалуе значи „еКспиринг“ лвалуе.

Дефиниција квалуе, цитирана из Ц ++ спецификације, је следећа:

„Ксвалуе је глвалуе која означава објекат или поље битова чији се ресурси могу поново користити (обично зато што је при крају свог животног века). [Пример: Одређене врсте израза који укључују референце рвалуе дају квалуес, као што је позив функцији чији је повратни тип референца рвалуе или премештај на пример референце типа рвалуе] “

То значи да лвалуе и првалуе могу истећи. Следећи код (копиран одозго) показује како се меморија (ресурс) вредности лвалуе, * птрИнт поново користи након што је избрисана.

инт * птрИнт = ново инт;
* птрИнт = 12;
цоут<< *ptrInt <<'\n';
делете птрИнт;
цоут<< *ptrInt <<'\n';
* птрИнт = 24;
цоут<< *ptrInt <<'\n';

Излаз је:

12
0
24

Следећи програм (копиран одозго) показује како се меморија целобројне референце, која је референца лвалуе коју враћа функција, поново користи у функцији маин ():

#инцлуде
коришћење простора имена стд;
инт & фн ()

инт и = 5;
инт & ј = и;
ретурн ј;

инт маин ()

инт & миИнт = фн ();
цоут<< myInt <<'\n';
миИнт = 17;
цоут<< myInt <<'\n';
ретурн 0;

Излаз је:

5
17

Када објекат као што је и у функцији фн () излази из опсега, он се природно уништава. У овом случају, складиште и је и даље поново коришћено у функцији маин ().

Горња два узорка кода илуструју поновну употребу складишта вредности. Могуће је поново користити складиште вредности (вредности) (види касније).

Следећи цитат који се односи на квалуе је из спецификације Ц ++:

„Генерално, ефекат овог правила је да се именоване референце рвалуе третирају као лвалуес, а неименоване референце рвалуе на објекте као квалуес. референце рвалуе на функције третирају се као лвалуес без обзира да ли су именоване или не." (Видимо се касније).

Дакле, квалуе је вредност или прва вредност чији се ресурси (складиште) могу поново користити. квалуес је пресек скупа лвалуес и првалуес.

Ксвалуе има више од онога што је описано у овом чланку. Међутим, квалуе заслужује цео чланак сам по себи, тако да додатне спецификације за квалуе нису обрађене у овом чланку.

Скуп таксономије категорије израза

Још један цитат из Ц ++ спецификације:

Белешка: Историјски гледано, вредности и вредности су биле такозване, јер су се могле појавити на левој и десној страни задатка (иако то више уопште није тачно); вредности су „генерализоване“ вредности, вредности су „чисте“ вредности, а вредности су „истекле“ вредности. Упркос својим именима, ови термини класификују изразе, а не вредности. - завршна напомена ”

Дакле, глвалуес је скуп унија вредности и квредности, а рвалуес је скуп унија вредности и вредности. квалуес је пресек скупа лвалуес и првалуес.

Од сада је таксономија категорија израза боље илустрована Веновим дијаграмом на следећи начин:

Закључак

Лвалуе је израз чија процена одређује идентитет објекта, бит-поља или функције.

Првалуе је израз чија процена иницијализује објекат или битно поље или израчунава вредност операнда оператора, како је одређено контекстом у којем се појављује.

Ксвалуе је лвалуе или првалуе, са додатним својством да се његови ресурси (складиште) могу поново користити.

Спецификација Ц ++ илуструје таксономију категорија израза дијаграмом стабла, указујући да у таксономији постоји нека хијерархија. За сада у таксономији не постоји хијерархија, па се неки аутори користе Веновим дијаграмом, јер таксономију илуструје боље од дијаграма стабла.

Водич за сенку Томб Раидера за Линук
Схадов оф тхе Томб Раидер је дванаести додатак серији Томб Раидер - акцијско-авантуристичкој игри коју је створио Еидос Монтреал. И критичари и фанови...
Како појачати ФПС у Линуку?
ФПС је скраћеница за Фрејмова у секунди. Задатак ФПС-а је да мери брзину кадрова у репродукцијама видео записа или играчким перформансама. Једноставни...
Најпопуларније лабораторијске игре Оцулус Апп
Ако сте власник Оцулус слушалица, онда морате бити упознати са бочним учитавањем. Бочно учитавање је поступак инсталирања не-продавничког садржаја на ...