punct de ordine

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare

O secvență punctului [1] (secvență punct) este un punct în executarea unui program de calculator în care se garantează că toate efectele secundare ale instrucțiunilor precedente au fost atinse și nici un efect secundar al următoarea instrucțiune a fost pusă în aplicare. Puncte de secvență sunt un concept cheie în limbaje cum ar fi C și C ++ , în care sunt importante pentru a determina validitatea unei anumite educații. Adăugarea punctelor de secvențe suplimentare în codul poate fi necesar, de exemplu, pentru a face o expresie bine definită și să asigure unicitatea ordinului de evaluare a operațiunilor conținute în ea.

In C ++ 11 secvența punct de expresie a fost înlocuită prin secvențiere. Având în vedere două expresii, există trei cazuri posibile de secvențiere: [2] [3] [4]

  1. evaluarea unei expresii poate fi „secvențializate înainte de în raport cu o altă expresie sau, echivalent, cealaltă este expresia „secvențiat după“.
  2. expresiile sunt „neprecizat secvențializate“, adică unul dintre cei doi este „secvențiat înainte“ , în raport cu altele, dar ordinea este nedeterminată.
  3. Evaluarea este „unsequenced“.

În timp ce în primul caz semantica programului sunt bine definite, celelalte două cazuri sunt problematice. În special, evaluarea expresiilor unsequenced se pot suprapune și dacă cele două expresii depind de un stat comun, rezultatul este nedeterminată și poate avea efecte catastrofale. Această situație este o problemă care se poate întâlni cu ușurință în calcul paralel ( rasa critică ), dar poate avea loc , de asemenea , într - un mod strict programe secvențiale. De exemplu, în evaluarea expresiei (a = 1) + (b = a) o parte din atribuire a = 1 pot fi finalizate înainte b = a și după parte, prin care , la sfârșitul evaluării b poate conține o stare intermediară de a total lipsit de sens.

Exemple de ambiguitate

Având în vedere cele două funcții f() și g() , la fel ca în C și C ++ operatorul + nu generează un punct de secvență, în evaluarea f()+g() nu se poate cunoaște a priori care apel între f() și g() vor fi evaluate mai întâi. Dimpotrivă, operatorul virgulă introduce o secvență punct, pentru care , în evaluarea f(),g() apelul f() va fi întotdeauna evaluate (și efectele sale secundare efectuate) înainte de evaluare g() .

Puncte de secvență joacă un rol important în definirea comportamentului expresiilor care manipuleaza de mai multe ori aceleași variabile. Un exemplu comun în C este expresia i=i++ , care atribuie valorii sale proprii și incremente variabila i i . În realitate, valoarea finală a la sfârșitul evaluării nu este definită, deoarece punctul nu determină o secvență de atribuire În mod firesc, acolo, pentru care creșterea ar putea fi efectuate înainte, în timpul sau după atribuirea. i [5] Alte limbi pot avea reguli diferite.

Puncte de secvență în C și C ++

În C [6] și C ++, [7] puncte de secvență sunt garantate în următoarele cazuri:

  1. Printre evaluarea operanzii stânga și din dreapta ale operatorilor && , || (ca rezultat al evaluării scurtcircuitului ) și virgulă. Pentru esemipio, în evaluarea *p++ != 0 && *q++ != 0 toate efectele secundare ale expresiei *p++ != 0 sunt finalizate înainte de orice încercare de acces variabila q .
  2. Printre prima evaluare operandul unui operator ternar :? Și cei doi operanzi rămase. De exemplu, în evaluarea a = (*p++) ? (*p++) : 0 creșterea prevăzută în primul operand a fost deja efectuată atunci când al doilea acces la p ar trebui să apară.
  3. La sfârșitul unei expresii complet, care este o expresie care nu face parte dintr-o altă expresie. Această categorie include declarația de expresie ( de exemplu , declarația a=b; ), întoarcere , evaluarea stării în if în care , switch , în while , și do - în while și toate cele trei expresii din blocul de control al unui for buclă..
  4. Înainte de a executa corpul unei funcții. Ordinea în care sunt evaluate argumentele este nedefinit, dar este garantat faptul că toate argumentele au fost evaluate (și efectele secundare datorate evaluarea lor realizată) înainte de a începe executarea funcției corpului. De exemplu, în evaluarea expresiei f(i++) + g(j++) + h(k++) , funcția f este apelată cu un argument a cărui valoare este egală cu prima creștere, dar variabila i i are fost deja crescut în cazul în care executarea corpului f începe. In mod similar, j și k sunt incrementează înainte de a evalua corpul funcțiilor respective. Cu toate acestea, ordinea în care f() , g() și h() se execută nu este definit, și nici nu este definit ordinea în care sunt executate cele trei incremente variabile. În cazul în care corpul f trebuie să acceseze variabilele j și k , se poate întâmpla ca nici unul, doar unul, sau ambele variabile au fost deja crescut. Este important de remarcat faptul că virgulele care apar în apelul f(a,b,c) nu sunt instanțe ale operatorului virgulă, dar sunt token - uri care formează sintaxa apelului funcției, și nu introduc puncte de secvență, astfel încât evaluarea ordinea argumentelor nu este definit.
  5. După evaluarea unui apel de funcție, după ce valoarea returnată a fost copiat în contextul de asteptare. Acest punct secvență este specificat în mod explicit numai în C ++. [8]
  6. După inițiatorul unei evaluări, de exemplu , după evaluarea 5 în declarația int a = 5; .
  7. Între declarators într-o secvență de declarații. De exemplu, există un punct de secvență între două evaluări consecutive ale a++ educație int x = a++, y = a++ . [9] Foarte important, în acest caz, virgula face parte din sintaxa declarației, nu un operator virgulă.

În C ++, operatorii supuse supraîncărcarea comporte ca funcțiile normale în ceea ce privește introducerea de puncte de secvență.

Notă

  1. ^ Secvență Puncte C , pe msdn.microsoft.com.
  2. ^ ISO / IEC 14882: 2011 , pe iso.org. Adus pe 4 iulie 2012 .
  3. ^ O mai fin granulată alternativă la punctele de secvență (revizuită) (WG21 / N2239 J16 / 07-0099) , pe open-std.org. Adus pe 5 iulie 2012 .
  4. ^ Ordinul de evaluare , pe en.cppreference.com. Adus pe 14 octombrie 2015 .
  5. ^ Specificațiile C99 , clauza 6.5 # 2:. „Între punctul secvența anterioară și următoare un obiect trebuieaibă valoarea stocată modificat cel mult o dată prin evaluarea unei expresii În plus, valoarea anterioară pot fi accesate doar pentru a determina valoarea la El este stocat. "
  6. ^ Anexa C a C99 specificației.
  7. ^ 1998 , C ++ standard secțiunea 1.9, punctele 16-18.
  8. ^ C ++ standard ISO 14882: 2003, secțiunea 1.9, nota 11.
  9. ^ C ++ standard ISO 14882: 2003, secțiunea 8.3: "Fiecare init-declarator într - o declarație este analizată separat ca și în cazul în care a fost într - o declarație de la sine."

linkuri externe

Informatică Portal IT : accesați intrările Wikipedia care se ocupă cu IT