Curs 2. Operatorii limbajului C ++.
structura programului
Operatorii controlează procesul de executare a programului. Un set de operatori de limbaj C ++ conține toate structurile de control ale programării structurate.
O instrucțiune compusă este limitată de bretele. Toate celelalte afirmații se termină cu punct și virgulă.- Declarație de gol -;
în timp ce (<выражение> ) <оператор>
face<оператор>în timp ce<выражение> ; În C ++, acest operator este diferit de ciclul de implementare clasic cu postconditie că, atunci când expresia adevăr vine continuarea ciclului, și nu din bucla.
pentru ([<начальное выражение> ]; [<условное выражение> ]; [<выражение приращения> ]) <оператор>
pentru corp declarație este executată atâta timp cât expresia condițională este falsă (0). Expresia inițială și exprimare increment utilizată de obicei pentru inițializare și modificarea parametrilor de ciclu și alte valori. Expresia inițială este evaluată o dată înainte de primul test al expresiei condițională. iar expresia creștere este evaluată după fiecare execuție a instrucțiunii. Oricare dintre cele trei expresii ale antetului ciclului, și chiar toate cele trei pot fi omise (nu uitați să lăsați doar un punct și virgulă). În cazul în care a omis expresia condițională. este considerat a fi adevărat, iar bucla devine infinit.
operator de ciclu pas în C ++ este flexibil și un design prietenos-utilizator, astfel încât operatorul ciclu cu o condiție prealabilă în timp ce folosind C ++ este extrem de rară, deoarece în cele mai multe cazuri, este mai convenabil de a folosi operatorul pentru.pauză; declarația break se termină declarația în timp. do. pentru și comutator. Ea poate fi conținută numai în corpul acestor operatori. Controlul este trecut la operatorul care urmează întrerupt. În cazul în care declarația break este scris in timp ce imbricate. do. pentru. comutator. el conclude abia acoperind operatorul.
continua; să continue controlul transferurilor declarație la următoarea iterație în buclă în timp. do. pentru. Ea poate fi conținută numai în corpul acestor operatori. Operatorii face și în timp ce următoarea iterație începe cu evaluarea expresiei condiționată. În declarația pentru următoarea iterație începe cu calcularea expresiei creștere, iar apoi există calculul expresiei condiționate.
întoarce [<выражение> ];
întoarcerea operatorului se încheie funcția în care este conținut, și se întoarce de control la funcția de apelare. Controlul este trecut apelantului, imediat după operatorul de apel. Valoarea expresiei. dacă este setat, se calculează, având în vedere tipul declarat pentru funcția care conține o declarație de întoarcere, și se întoarce la funcția de apelare. În cazul în care expresia este omis, valoarea returnată nu este funcție definită.
În termeni formali, operatorii rupe. continue și retur nu sunt operatori de programare structurată. Cu toate acestea, utilizarea lor este justificată în cantități limitate, deoarece acestea facilitează înțelegerea programului și a face posibilă evitarea structurilor imbricate mari. De exemplu, vom verifica datele de intrare la anomalie. Dacă nu utilizați acești operatori, atunci întregul proces va trebui să investească în blocul condițională, care afectează lizibilitatea programului. În schimb, puteți scrie un bloc condițional mic, care organizează ieșirea din funcție cu datele de intrare incorecte.
I / O, nu face parte din limbajul C ++. și îndeplinește funcțiile care fac parte din biblioteca standard. Pentru detalii suplimentare a se vedea. Curs 4.
// Eroare - valoare returnată necunoscută // Dreapta
Funcția cu tipul de vid nu poate returna o valoare. Cu toate acestea, apelarea unei funcții cu tipul de vid nu dă valoare, astfel încât funcția de tip void poate utiliza funcția de apel cu tipul de vid ca expresie în declarația de returnare.
Această formă de declarație întoarcere este importantă atunci când scrieți un șablon funcție. atunci când tipul de retur este un parametru șablon.
2.2.1. funcţii inline
Funcția poate fi determinată cu inline specificator. Aceste funcții sunt numite încorporate. Specificator inline spune compilatorului că înlocuirea deschisă este, în general, de preferat să se pună în aplicare funcția apelului funcției corpului și că el ar trebui să încerce de fiecare dată pentru a genera în codul apelantului corespunzător funcției inline în loc de a crea codul functiei singur (o dată) și apoi apelul prin intermediul mecanismului normal de apel. Specificator inline nu are nici un efect asupra înțelesului apelului funcției.
Deschideți schimbarea nu afectează rezultatele apelând funcția, diferit de macro. Sintaxa funcției încorporate are descrierea obișnuită a funcției și se supune tuturor normelor referitoare la domeniul de aplicare și tipuri de control. substituție deschisă este pur și simplu o realizare a funcției de apel. În loc de a codului, precum și parametrii de control ai transmisiei unice funcția de copiere a corpului, o funcție de copiere a corpului, modificată corespunzător pentru a efectua un apel este plasat. Acest lucru economisește timp pentru transferul controlului.
Pentru toate cele mai simple, dar funcțiilor la funcțiile de rulare domină costul timpului cu privire la serviciul de apel. Din aceasta rezultă că, pentru toate, dar cele mai simple funcții de economisire în detrimentul unei substituții deschise este minimă. Candidatul ideal pentru o substituție deschisă este o funcție care face ceva simplu, cum ar fi o creștere sau valori de returnare. Existența unor astfel de funcții este un tratament au necesitat de date ascunse.
2.2.2. funcţii valori prestabilite
int g (int m = 1, int n); int h (int m = 1, int n = 2); int h (int m = 1, int n = 2), int h (int m = 0, int n = 0) int f (int m = 1, int n = 2); int f (int m int n.) f (5, 6); f (5); f ();
// // // eroare de eroare corectă - repetată implicite // Eroare - modificați setările implicite // dreapta // apela funcția cu doi parametri // echivalent cu apelarea f (5, 2); Echivalent // apel f (1, 2);
2.2.3. setările de program
Funcția principală. ca orice altă funcție poate avea parametri. Acești parametri sunt transmise programului de la linia de comandă.
void main (int argc, char * argv [])
// nume argc și argv nu sunt o cerință a limbii
2.2.4. Funcții cu număr variabil de parametri
În timpul interpretării listei de parametri este o funcție utilizează informațiile nu sunt disponibile pentru compilator. Prin urmare, nu se poate garanta că opțiunile așteptate sunt prezente într-adevăr, sau că acestea au tipurile corecte. Este clar că, dacă parametrul nu este declarat, compilatorul nu are informațiile necesare pentru a efectua standard de verificare și de transformare de tip.
Funcție numai cu parametrii nedeclarați, în principiu, pot fi definite, dar va fi dificil de a selecta parametrii, ca macro-uri pentru a lucra cu parametrii nedeclarați folosind numele acestuia din urmă a anunțat parametrul formal.
In interiorul functiei, programator este responsabil pentru selectarea stiva de parametri suplimentari. Pentru a lucra cu ele folosind macro-uri va_arg. va_start și va_end. stdarg.h definite în fișierul.
Un exemplu de o funcție de variabile explicative cu privire la numărul de programe cu parametri, a se vedea. La sfârșitul conferinței.
2.3. preprocesor
Preprocesorul - un program care procesează textul programului de compilator. Astfel, compilatorul devine textul de intrare, care poate fi diferit de cel pe care îl vedeți. Preprocessor este controlată de directive. Utilizarea operațiune preprocessor poate fi realizată următoarele elemente:- includerea în programul a fișierelor specificate;
- Identificatorii de înlocuire secvențe de simboluri;
- substituție macro. și anume denumirilor de înlocuire parametrizate preprocessor textul format pentru a răspunde argumentelor specifice;
- excluderea din părțile individuale ale textului (compilare condiționată).
2.3.1. inclusiv fișiere
Include fișierele produse utilizând directiva #include. care are următoarea sintaxă:
#include<путь>#include „calea“
paranteze unghiulare sunt element de sintaxă.
Directiva #include include conținutul calea de fișier care este specificat în fișierul compilat în locul liniei cu directiva. În cazul în care calea este închisă între paranteze unghiulare, fișierul este căutat în directoarele standard. În cazul în care calea este indicat în ghilimele și este pe deplin specificat, fișierul este căutat în directorul specificat, iar în cazul în care calea nu este complet definită - în directorul curent. Prin această directivă, puteți include textul programului ca un standard, și fișierele sale.
De asemenea, așa cum este indicat mai sus, în C ++ un număr de funcții, cum ar fi funcții de intrare / ieșire, alocarea dinamică a memoriei, etc. Ele nu fac parte din limba, ca parte a bibliotecilor standard. Pentru a utiliza funcțiile standard de bibliotecă, este necesar, în textul programului includ așa-numitele fișiere antet (în descrierea fiecărei funcții indică fișier antet este necesară pentru ea). Acest lucru se face, de asemenea, folosind #include Directiva preprocesor.
Directiva #include poate fi imbricate. Acest lucru înseamnă că se poate întâlni în fișierul inclus o altă directivă #include. Nivelul admis de directivele #include cuibărit depinde de punerea în aplicare a compilatorului.
2.3.2. macrosubstitutions
Directiva #define Macro puse în aplicare. care are următoarea sintaxă:
#define<идентификатор><текст>#define<идентификатор> (<список параметров> ) <текст>
Directiva #define înlocuiește toate aparițiile identificatorul în fișierul sursă în text. ca urmare a directivei identificatorului. Acest proces se numește expansiune macro. Identificatorul este înlocuit numai în cazul în care acesta este un semn separat. De exemplu, în cazul în care identificatorul este parte dintr-un șir mai lung sau element de identificare, acesta nu este înlocuit.
Textul este o colecție de token-uri, cum ar fi cuvinte cheie, constante, identificatori, sau expresie. Unul sau mai multe caractere goale trebuie separate de identificatorul de text (sau parametrii paranteze). Dacă textul nu se potrivește pe linie, acesta poate fi continuat pe linia următoare, pentru a face acest tip de la sfârșitul liniei de caractere „backslash“, urmată imediat de presă „ENTER“.
Textul poate fi omisă. În acest caz, toate copiile ID-ul va fi eliminat din codul sursă. Cu toate acestea, el este considerat ca un anumit identificator.
lista parametrilor. dacă este prezent, conține unul sau mai mulți identificatori separați prin virgulă și trebuie să fie inclus în paranteze. Identificatorii din lista ar trebui să fie diferite unele de altele. Domeniul lor de aplicare este de macro-uri limitate, în care acestea sunt date. Numele parametrilor formale din text se marchează poziția în care urmează să fie substituit argumente reale ale unui apel macro.
Identificatorul de apel macro este înregistrat urmat în lista paranteze rotunde de argumente reale parametrii formali ai listei de parametri corespunzători. Listele de fapt, parametrii formali trebuie să conțină același număr de elemente. A nu se confunda substituirea argumentelor în macro cu argumentele funcției de transfer. Schimbare în preprocesorul este pur și simplu un caracter de text. Orice tip de calcul sau transformare nu se efectuează.
#define N 100 #define MULT (a, b) ((a) * (b)) #define MAX (x, y) ((x)> (y)). (X). (Y)
Call MULT (x + y, z) se înlocuiește cu ((x + y) * (z)). In absenta parantezelor interne au transformat (x + y * z). ceea ce nu este adevărat.
Macrocall MAX (i, a [i ++]) se înlocuiește cu ((i)> (a [i ++])). (I). (A [i ++])). Rezultatul calculului este imprevizibil.
Cele Directiva #define două jetoane pot fi „lipite“ împreună. Pentru a face acest lucru, ei au nevoie să combine mărcile ## (stânga și dreapta sunt valide caractere goale). Preprocesor combină aceste token-uri într-o singură. De exemplu, VAR #define macro (i, j) i j ## la VAR apel macro (x, 6) formează identificatorul x6.
Simbolul # plasat în fața unui argument macro indică necesitatea de a se transforma într-un șir de caractere. Când apel macro de proiectare #<формальный параметр> se înlocuiește cu "<фактический параметр> “.
Textul de înlocuire poate fi anulată Directiva #undef. care are următoarea sintaxă:
#undef <идентификатор>
Directiva #undef anulează definiția actuală pentru identificator #define. Pentru a anula macro, este suficient să se definească identitatea. Specificarea listei de parametri nu este necesară. Aceasta nu este o eroare de a folosi directiva identificator #undef, care nu a fost anterior definit sau efect este deja anulat.
Adoptat în C / formă de limbaj macro C ++ este un dezavantaj serios. Acum, această formă poate fi considerată depășită datorită prezenței mijloacelor mai potrivite de limbaj, cum ar fi șabloane. Spațiu de nume. funcții inline și constante. De asemenea, utilizarea pe scară largă a turnat în orice limbă semnalează un design rău. Macrocomenzi, și să aducă o sursă frecventă de erori. Faptul că se poate face fără ele, face programare în C ++ este mult mai sigur și mai elegant.
2.3.3. compilare condiționată
compilare condiționată este prevăzută în C ++ setul de instrucțiuni limbaj, care, în esență, nu controlăm compilarea și preprocesare. Aceste directive permit excluse la elaborarea oricărei porțiuni din fișierul original prin verificarea condițiilor.
#if<константное выражение> [<текст> ] [#elif<константное выражение> [<текст> ]]. [#else [<текст> ]] # Endif
Fiecare directivă #if în același fișier sursă trebuie să fie conforme cu directiva # endif sa finală. Între #if și directivele # endif poate fi orice număr de directive #elif și nu mai mult de o directivă #else. În cazul în care Directiva #else este prezent, între ea și directiva # endif la acest nivel de imbricare nu ar trebui să fie alte directive #elif.
Preprocessor selectează porțiunea de text pentru prelucrare pe baza de calcul al expresiei constante. în urma fiecărei directive #if și #elif. Textul selectat. ca urmare o expresie constantă, cu o valoare de „true“. Dacă nici unul dintre expresia constantă limitată nu este adevărat, preprocesorul selectează textul. ca urmare a directivei #else. În cazul în care directiva #else lipsește, atunci este selectat nici un text.
O expresie constantă poate conține operație preprocesorul definită (<идентификатор> ). Această operațiune returnează o valoare reală, dacă identificatorul predeterminat este definit în mod curent, expresie altfel false.
#if (sizeof (void *) == 2) #define SDATA #else #define LDATA # endif #if definite (credit) de credit (); #elif definit (DEBIT) debit (); printerror #else (); # endif