Majoritatea operatorilor sunt operatori de expresie, care au forma unei expresii;
De obicei, expresiile de expresie sunt sarcini și apeluri pentru funcții.
Dacă oricare dintre identificatorii din lista de descrieri a fost descris anterior, descrierea externă este împinsă în momentul executării blocului și va intra din nou în vigoare după finalizarea acestuia. Fiecare inițializare a variabilelor auto sau de registru se efectuează de fiecare dată când intri în capul blocului. În bloc pentru a face transferul; în acest caz, inițializarea nu este efectuată. Inițializarea variabilelor care au o clasă de memorie statică (# 4.2) se efectuează o singură dată la începutul execuției programului.
În ambele cazuri, expresia este evaluată și, dacă nu este zero, este executat primul sub-operator. În cel de-al doilea caz, cel de-al doilea suboperator este executat dacă expresia este 0. Ca de obicei, ambiguitatea "else" este rezolvată de faptul că altceva este asociat cu ultimul numărător, dacă nu este altceva.
Execuția sub-operatorului se repetă până când valoarea expresiei este nenulă. Verificarea este efectuată înainte de executarea fiecărei instrucțiuni.
Execuția sub-operatorului se repetă până când valoarea expresiei devine zero. Verificarea se efectuează după fiecare executare a instrucțiunii.
Acest operator este echivalent cu următoarele:
Prima expresie specifică inițierea bucla; a doua expresie specifică verificarea, efectuată înainte de fiecare iterație, pe care să ieșiți din buclă, dacă expresia devine zero; A treia expresie specifică adesea creșterea care urmează a fi efectuată după fiecare repetare.
Fiecare sau toate expresiile pot fi omise. Absența expresiei_2 face ca declarația implicită în timp ce este echivalentă cu timpul (1); Expresiile rămase omitete sunt pur și simplu ignorate în extensia descrisă mai sus.
Expresia trebuie să fie un tip întreg sau un tip de pointer. Orice operator din cadrul unui operator poate fi etichetat cu unul sau mai multe prefixe de caz după cum urmează:
unde expresia constantă trebuie să aibă același tip cu expresia de comutare; sunt efectuate transformări aritmetice obișnuite. Într-o instrucțiune switch, nici două constante, caractere marcate, nu pot avea aceeași valoare. Expresiile constante sunt definite exact în # 15.
De asemenea, poate exista cel mult un prefix al operatorului formularului
Când se execută instrucțiunea comutator, ea calculează expresia sa și o compară cu fiecare caz constantă. Dacă una dintre constante este egală cu valoarea expresiei, atunci controlul este transmis expresiei urmând cazul prefixat. Dacă niciun caz nu corespunde unei expresii și există un prefix implicit, atunci controlul este transmis expresiei precedate. Dacă nu există nici un caz corespunzător și opțiunile implicite, atunci niciuna dintre instrucțiunile din comanda switch nu este executată.
Cazul și prefixele implicite nu schimbă singură fluxul de control, care după o întârziere merge mai departe, sărind peste aceste prefixe. Pentru a părăsi comutatorul, consultați pauză, # 9.8.
În mod normal, operatorul dependent de comutare este compus. În capul acestui operator pot fi descrieri, dar inițializarea variabilelor automate și a registrelor nu reușește.
încheie executarea celei mai apropiate anexe în timp ce, face, pentru, sau comuta operator; Controlul este transferat operatorului după cel finalizat.
solicită transferul de control la continuarea controlului părții de buclă a celei mai mici închise în timp ce, pentru sau pentru; adică la sfârșitul bucla buclei. Mai exact, la fiecare dintre operatori
continua este echivalent cu continutul. (Continentul urmează o declarație goală, # 9.13.)
Primul poate fi utilizat numai în funcții care nu returnează valori, adică în funcții cu tipul de valoare de returnare void. A doua formă poate fi utilizată numai în funcții care nu returnează o valoare; Funcția care apelează funcția returnează valoarea expresiei. Dacă este necesar, expresia este convertită, ca și în cazul alocării, tipului de funcție în care a apărut. Omiterea sfârșitului unei funcții este echivalentă cu returnarea unei returnări fără o valoare de retur.
Identificatorul trebuie să fie o etichetă (# 9.12) localizată în funcția curentă.
care servește pentru a descrie identificatorul ca etichetă. Eticheta este folosită doar ca obiect pentru a obține. Domeniul de aplicare al etichetei este funcția curentă, excluzând orice subbloc în care a fost rescris același identificator. Vezi # 4.1.
O instrucțiune goală este folosită pentru a plasa o etichetă chiar înaintea instrucțiunii compus sau pentru a furniza operatori cum ar fi în timp ce cu un corp gol.
Rezultatul expresiei trebuie să fie un pointer. Obiectul spre care este arătat este distrus. Aceasta înseamnă că, după instrucțiunea de ștergere, nu puteți garanta că obiectul are o valoare specifică; vezi # 17. Efectul aplicării ștergerii asupra unui indicator care nu a fost obținut din noua operațiune (# 7.1) nu este definit. Cu toate acestea, distrugerea unui indicator cu o valoare nulă este în siguranță.
Semnificația operatorului asm nu este definită. De obicei, este folosit pentru a transfera informații prin intermediul compilatorului la asamblare.
Un program C ++ constă dintr-o serie de definiții externe. O definiție externă descrie un identificator ca având o clasă de memorie statică și definește tipul acesteia. Specificatorul de tip (# 8.2) poate fi, de asemenea, gol, iar în acest caz se presupune tipul int. Domeniul de aplicare al definițiilor exterioare se extinde până la sfârșitul fișierului în care sunt descrise, la fel cum acțiunea descrierilor este salvată la sfârșitul blocului. Sintaxa definițiilor externe este aceeași ca și pentru descrieri, cu excepția faptului că doar la acest nivel și în interiorul descrierilor de clasă poate fi dat codul (textul programului) al funcției.
Singurul specificator de clasă de memorie (specifici sc), care este acceptabil între specificatorii de specificații, este extern, static, supraîncărcare, inline și virtual. Descriptorul de funcții este similar cu descriptorul unei "funcții care revine", cu excepția faptului că include numele parametrilor formali ai funcției care este definită.
Descriptorul de funcții are forma
Forma listei descrierilor parametrilor este definită în # 8.4. Singura clasă de memorie care poate fi specificată este cea în care parametrul real corespunzător este copiat, dacă este posibil, în registru, la introducerea funcției. Dacă constanta este setată ca inițializator pentru parametru, atunci această valoare este folosită ca valoare implicită a parametrului.
Corpul funcției are forma
Iată un exemplu simplu de definiție completă a funcției:
Aici int este un specificator de tip; max (int a, int b, int c) este un descriptor de funcții; - blocarea specificând textul programului (codului) operatorului.
Ca și în contextul numelui expresiei (sau, mai degrabă, numele ca parametru formal) se înțelege un pointer la primul element, descrierea formală a parametrilor descriși ca „matrice de.“, Sunt ajustate pentru a citi „pointer.“.
Initializatorul clasei de baza are forma
Se utilizează pentru a specifica parametrii constructorului de clasă de bază în constructorul de clasă derivat. De exemplu:
Constructorul de clasă de bază este apelat pentru obiectul d cu parametrul 11.
Clasa de memorie a acestor date este statică.
Dacă există mai multe definiții ale datelor externe cu același nume, atunci definițiile trebuie să se potrivească exact cu tipul și clasa memoriei, iar inițiatorii (dacă există) trebuie să aibă aceeași valoare.
Compilatorul C ++ conține un preprocesor care poate efectua substituții macro, compilație condiționată și includerea fișierelor numite. Linile care încep cu # se referă la preprocesor. Aceste linii au o sintaxă independentă de restul limbii; ele pot apărea oriunde pentru a avea un efect propagat (indiferent de domeniul de aplicare) până la sfârșitul fișierului programului sursă.
Rețineți că definițiile const și inline oferă alternative pentru cele mai multe utilizări #define.
determină preprocesorul să înlocuiască apariția ulterioară a identificatorului specificat de șirul de caractere. Un punct și virgulă în interiorul (sau la sfârșitul) unui șir de caractere face parte din acest șir.
Vedeți șirul
în cazul în care nu există nici o diferență între primul identificator și (este macro cu parametri. ocurențe ulterioare ale primului identificator de la atingerea acesteia (, secvență de simboluri delimitate prin virgulă, u) se înlocuiesc șir de caractere specificat în definiția. Fiecare identificator de locație, văzută în lista de determinare parametrilor Parametrii actuali ai apelului sunt caracterele de caractere separate prin virgule, dar virgule într-un șir închis în ghilimele sau în paranteze ruglyh nu sunt delimitate parametri. Numărul de parametri formale și reale trebuie să se potrivească. Șiruri și constantele de caractere într-un șir de caractere sunt scanate în căutare de parametrii formali, dar șirurile și constantele de caractere în restul programului nu pot fi scanate în căutarea specifice (folosind Define) identificatori.
În ambele cazuri, șirul de înlocuire este scanat din nou în căutarea altor identificatori specifici. În ambele cazuri, definiția lungă poate fi continuată pe o altă linie scriind \ la sfârșitul liniei de continuare.
Linia de comandă a formularului
duce la anularea definiției de preprocesor a identificatorului.
determină înlocuirea acestei linii cu întregul conținut al fișierului. Mai întâi, fișierul numit este căutat în directorul fișierului sursă original și apoi în locații standard sau specificate.
Alternativ, linia de comandă a formularului
căutări numai în locația standard sau specificată și nu caută fișierul sursă original din director. (Modul în care aceste locuri sunt configurate nu face parte din limbă.)
Includerile cu #include pot fi imbricate.
verifică dacă rezultatul evaluării expresiei este diferit de zero. Expresia trebuie să fie o expresie constantă, care este discutată în # 15; în ceea ce privește utilizarea acestei directive, există restricții suplimentare: o expresie constantă nu poate conține dimensiuni sau constante enumerabile. Pe lângă operațiile uzuale C, poate fi utilizată o operație unară definită. Dacă este aplicat unui identificator, acesta dă o valoare diferită de zero dacă acest identificator a fost definit anterior folosind #define și apoi nu a existat ștergerea definiției cu #undef; altfel valoarea lui este 0.
Linia de comandă a formularului
verifică dacă identificatorul este definit în preprocesor în acest moment; adică dacă a fost un obiect #define de linie de comandă.
Linia de comandă a formularului
verifică dacă identificatorul este nedefinit în preprocesor în acest moment.
După linia fiecăruia dintre cele trei tipuri poate fi un număr arbitrar de linii, care poate conține o linie de comandă
și apoi la linia de comandă
Dacă condiția verificată este adevărată, toate liniile dintre #else și #endif sunt ignorate. Dacă condiția verificată este falsă, atunci toate liniile dintre test și #else sau, în absența #else, #endif, sunt ignorate.
Aceste construcții pot fi imbricate.
Acesta determină compilatorul să-și asume, de exemplu, pentru a diagnostica erorile care definește constantă următorul număr al liniei fișierului sursă și identificatorul curent de nume de fișier de intrare. Dacă lipsește identificatorul, numele fișierului stocat nu este modificat.
Apoi, definiția lui g poate avea următoarea formă:
Rețineți că f trebuie să fie descris explicit în programul de asteptare, deoarece aspectul său în g (f) nu a fost urmat (.
alocarea trebuie să furnizeze (într-o manieră dependentă de mașină) că valoarea returnată este potrivită pentru conversia la un indicator dublu; în acest caz, utilizarea funcției este mobilă. Diferitele mașini diferă în ceea ce privește numărul de biți din indexuri și cerințele pentru alinierea obiectelor. Obiectele complexe sunt aliniate la limita cea mai strictă cerută de oricare dintre componentele sale.
În mai multe locuri, C ++ necesită o expresie care se evaluează la o constantă: ca limite array (# 8.3), în expresia caz (# 9.7), în funcție de valorile parametrilor atribuite în mod implicit (# 8.3) și initializatori (# 8.6 ). În primul caz, expresia poate include numai constante întregi, constante de caractere, constante descrise ca nume și dimensiune expresii, eventual legate de operații binare
sau operațiuni unare
sau operațiuni terestre
pentru a obține memorie. Parametrul specifică numărul de octeți necesari. Memoria va fi inițializată. Dacă _new nu poate găsi cantitatea necesară de memorie, ea va reveni la zero.
Operația de ștergere cere o funcție
pentru a elibera memoria indicată de pointer pentru reutilizare. Rezultatul numelui _delete () pentru un pointer care nu a fost primit de la _new () nu este definit, același lucru se aplică apelului repetat la _delete () pentru același pointer. Cu toate acestea, ștergerea utilizând ștergerea unui indicator cu o valoare zero este inofensivă.
Versiunile standard ale _new () și _delete () sunt furnizate, dar utilizatorul poate folosi alte, mai potrivite pentru aplicații specifice.
Atunci când un obiect de clasă este creat utilizând noua operație, constructorul va folosi (implicit) nou pentru a obține memoria necesară. Constructorul poate implementa propriile sale rezervări de memorie atribuind acest pointer oricăror utilizări. Prin atribuirea acestei valori la zero, distrugatorul poate evita operațiunea de ștergere a memoriei standard pentru obiectul său de clasă. De exemplu:
La intrarea în acest constructor, este diferită de zero dacă rezervarea de memorie a avut deja loc (la fel ca în cazul obiectelor automate) și zero altfel.
Dacă clasa derivată implementează acest lucru, apelul către constructor (dacă există) al clasei de bază va avea loc după atribuire, astfel încât constructorul clasei de bază se referă la obiect prin constructorul clasei derivate. Dacă constructorul clasei de bază implementează acest lucru, valoarea va fi de asemenea folosită de constructor (dacă există) din clasa derivată.