Izbe-izlik noqatı

C hám C++ tillerinde, izbe-izlik noqatı — bul kompyuter programmasınıń orınlanıwındaǵı aldıńǵı bahalawlardıń barlıq qosımsha tásirleri orınlanǵanına hám keyingi bahalawlardan hesh qanday qosımsha tásirler ele orınlanbaǵanına kepillik berilgen hár qanday noqattı anıqlaydı. Olar ańlatpalardıń durıslıǵın hám, eger durıs bolsa, múmkin bolǵan nátiyjelerin anıqlaw ushın tiykarǵı túsinik bolıp tabıladı. Ańlatpanı anıq etiw hám bir durıs bahalaw tártibin támiyinlew ushın kóbirek izbe-izlik noqatların qosıw geyde zárúr.

C11 hám C++11 hújjetleri «izbe-izlik noqatı» terminin paydalanıwdı toqtattı hám endi alternativ terminlerdi qollanadı:

 Bir ańlatpanıń bahalanıwı basqa bir ańlatpanıń bahalanıwınan «aldın dizbekleniwi» múmkin. (Ekvivalent túrde, basqa ańlatpanıń bahalanıwı birinshisiniń bahalanıwınan «keyin dizbekleniwi» múmkin.)
 Ańlatpalardıń bahalanıwı «anıq emes dizbeklengen», bul birewiniń ekinshisinen «aldın dizbeklengenin» bildiredi, biraq qaysı biri ekeni anıqlanbaǵan.
 Ańlatpalardıń bahalanıwı «dizbeklenbegen», bul hárbir ańlatpadaǵı operaciyalardıń aralasıp ketiwi múmkin ekenin bildiredi.

Dizbeklenbegen bahalawlardıń orınlanıwı bir-birin basıp ótiwi múmkin, eger olar birdey jaǵdaydı bólisse, potencial túrde apatlı anıqlanbaǵan háreketke alıp keledi. Bul jaǵday parallel esaplawda payda bolıwı múmkin, jarıs jaǵdayların payda etedi, biraq anıqlanbaǵan háreket bir aǵımlı jaǵdaylarda da payda bolıwı múmkin. Mısalı, a[i] = i++; (bunda a — massiv, al i — pútin san) anıqlanbaǵan háreketke iye.

 Anıq emeslik mısalları 
f() hám g() degen eki funkciyanı qarastırayıq. C hám C++ tillerinde + operatorı izbe-izlik noqatı menen baylanıslı emes, sonlıqtan f()+g() ańlatpasında ya f() yamasa g() birinshi orınlanıwı múmkin. Útir operatorı izbe-izlik noqatın kirgizedi, sonlıqtan f(),g() kodında bahalaw tártibi anıqlanǵan: birinshi f() shaqırıladı, sońınan g() shaqırıladı.

Izbe-izlik noqatları bir ańlatpa ishinde birdey ózgeriwshi bir neshe ret ózgertilgende de áhmiyetli boladı. Kóp keltiriletuǵın mısal — bul C ańlatpası i=i++, ol kórinip turǵanınday i-ge onıń aldıńǵı mánisin de beredi, hám i-di de arttıradı. i-diń sońǵı mánisi anıq emes, sebebi, ańlatpanı bahalaw tártibine baylanıslı, inkrement tayınlawdan aldın, keyin yamasa onıń menen aralasıp orınlanıwı múmkin. Belgili bir tildiń anıqlaması múmkin bolǵan háreketlerdiń birin kórsetiwi múmkin yamasa ápiwayı hárekettiń anıqlanbaǵan ekenin aytıwı múmkin. C hám C++ tillerinde bunday ańlatpanı bahalaw anıqlanbaǵan háreketke alıp keledi. C# sıyaqlı basqa tiller tayınlaw operatorınıń hám inkrement operatorınıń orınlanıw tártibin solay anıqlaydı, i=i++ ańlatpasınıń nátiyjesi kepillengen.

 Minez-qulıq 

 C++03 ke shekem 
C hám C++ tillerinde izbe-izlik noqatları tómendegi orınlarda payda boladı. (C++ tilinde artıqsha júklengen operatorlar funkciyalar sıyaqlı isley aladı, sonlıqtan artıqsha júklengen operatorlar funkciya shaqırıwları sıyaqlı izbe-izlik noqatların kirgizedi.)

 && (logikalıq HÁM), || (logikalıq YAMASA) (qısqa tutasıw bahalawınıń bir bólegi retinde) hám útir operatorlarınıń shep hám oń operandların bahalaw arasında. Mısalı, *p++ != 0 && *q++ != 0 ańlatpasında, *p++ != 0 kishi ańlatpasınıń barlıq qosımsha tásirleri q-ǵa kiriwge hár qanday urınıwdan aldın tamamlanadı.
 Úshlik shártli operatorınıń birinshi operandın hám onıń ekinshi yamasa úshinshi operandın bahalaw arasında. Mısalı, a = (*p++) ? (p++) : 0 ańlatpasında birinshi p++ ten keyin izbe-izlik noqatı bar, bul onıń ekinshi instanciya orınlanǵanǵa shekem álleqashan kóbeytilgenin bildiredi.
 Tolıq ańlatpanıń aqırında. Bul kategoriyaǵa ańlatpa operatorları (a=b; sıyaqlı), return operatorları, if, switch, while yamasa do-while operatorlarınıń basqarıwshı ańlatpaları hám for operatorındaǵı úsh ańlatpanıń hárbiri kiredi.
 Funkciya shaqırıwında funkciyaǵa kirgiziwden aldın. Argumentlerdiń qaysı tártipte bahalanatuǵını anıqlanbaǵan, biraq bul izbe-izlik noqatı olardıń barlıq qosımsha tásirleriniń funkciyaǵa kirgiziwden aldın tamamlanǵanın bildiredi. f(i++) + g(j++) + h(k++) ańlatpasında, f i-diń dáslepki mánisiniń parametri menen shaqırıladı, biraq i f-tiń denesine kirgiziwden aldın arttırıladı. Sonday-aq, j hám k sáykes túrde g hám h-ǵa kirgiziwden aldın jańalanadı. Degen menen, f(), g(), h() qaysı tártipte orınlanatuǵını yamasa i, j, k qaysı tártipte arttırılatuǵını anıqlanbaǵan. Eger f-tiń denesi j hám k ózgeriwshilerine kirse, ol ekewiniń de, hesh biriniń de yamasa tek biriniń ǵana arttırılǵanın tabıwı múmkin. (f(a,b,c) funkciya shaqırıwı útir operatorın paydalanıw emes; a, b hám c-nıń bahalaw tártibi anıqlanbaǵan.)
 Funkciyadan qaytqanda, qaytarılatuǵın mánis shaqırıwshı kontekstke kóshirilgennen keyin. (Bul izbe-izlik noqatı tek C++ standartında ǵana kórsetilgen; ol C-de tek jasırın túrde bar.)
 Inicializatordıń aqırında; mısalı, int a = 5; járiyalanıwında 5-tiń bahalanıwınan keyin.
 Hárbir járiyalanıwshı izbe-izligindegi hárbir járiyalanıwshı arasında; mısalı, int x = a++, y = a++ de a++-tıń eki bahalanıwı arasında. (Bul útir operatorınıń mısalı emes.)
 Kirgiziw/shıǵarıw format specifikatorı menen baylanıslı hárbir túrlendiriwden keyin. Mısalı, printf("foo %n %d", &a, 42) ańlatpasında, %n bahalanǵannan keyin hám 42 basılmastan aldın izbe-izlik noqatı bar.

 C11 hám C++11 
C++11 hár túrli ózgerisler alıp keldi, sonıń ishinde tildiń ónimliligin, qolaylılıǵın hám kóp aǵımlılıǵın jaqsılaytuǵın ózgeshelikler bar. Aǵımlar ushın til qollap-quwatlawınıń kirgiziliwi sebepli, C11 hám C++11 bahalaw tártibi ushın jańa terminologiya kirgizdi. Bir operaciya ekinshisinen «aldın dizbekleniwi» múmkin, ekewi «anıq emes dizbekleniwi» múmkin (birewi ekinshisinen aldın tamamlanıwı kerek) yamasa ekewi «dizbeklenbegen» bolıwı múmkin (hárbir ańlatpadaǵı operaciyalar aralasıp ketiwi múmkin).

 C++17 
C++17 bahalaw tártibiniń bir neshe aspektlerin shekledi. new ańlatpası bárqulla konstruktor argumentlerin bahalawdan aldın yad ajıratıwın orınlaydı. <<, >>, ., ., -> operatorları hám indeks hám funkciya shaqırıw operatorları shepten ońǵa bahalanıwına kepillik berilgen (olar qayta júklengen bolsa da, bolmasa da). Mısalı, kod:std::cout << a() << b() << c();   // (((std::cout << a()) << b()) << c()) retinde parsinglenediendi a, b hám c-nıń sol tártipte shaqırılıwına jańadan kepillik beredi. Hár qanday tayınlawǵa uqsas operatorınıń oń jaǵı shep jaǵınan aldın bahalanadı, sonlıqtan b() *= a(); birinshi a-nı bahalawına kepillik beredi. Aqırında, funkciya parametrleriniń qaysı tártipte bahalanatuǵını implementaciyaǵa baylanıslı bolıp qalsa da, kompilyator endi bir neshe parametrler boyınsha kishi ańlatpalardı aralastırıwǵa ruqsat etilmeydi.

 Derekler 

Kategoriya:Programmalastırıw paradigmaları
__BÖLİDİMÖNDEMEW__