Sunteți pe pagina 1din 31

1.

Introducere
Limba de programare C ++ a fost dezvoltată pe baza limbajului cu Bjarne Stroustrup.
Autorul limbajului C aparține lui Denis Ritchie, angajat al AT & T Bell Laboratories
(1970). Mai întâi limba C a fost scrisă pentru a crea și a susține sistemul de operare
UNIX. Până la acel moment, toate software - ul sistemului de operare UNIX au fost scrise fie
pe asamblare lang ke s, sau în limba B, dezvoltat de Ken Thompson - cu dătătorul sistemului
UNIX.limbajul C - un limbaj de uz general, și poate fi folosit pentru a scrie o varietate de
programe, dar populația sa p Nosta a fost asociat în principal cu sistemul de operare
UNIX. Pentru sistemul bo Derzhko UNIX a fost necesar pentru a scrie programe în limba C.
C și UNIX se potrivesc , astfel încât , împreună în curând mediul UNIX, aproape toate
programele comerciale au fost scrise în limba C. C a devenit atât de popular încât acesta este
special adaptat pentru alte sisteme de operare, iar utilizarea sa nu se limita la sistemele bazate
pe UNIX. În ciuda acestei popularități, limba C nu a fost lipsită de deficiențe.
Mai ales cu limba este ca fiind limba de nivel înalt, a păstrat multe caracteristici ale
limbajului de nivel scăzut. Limba Cu dezintegrări de fals undeva între limbi este
foarte de nivel înalt și de nivel scăzut de limbi, iar acest lucru este forte și punctele
slabe ale acesteia, în același timp. Ca limbaj de asamblare (limbaj de nivel scăzut),
limbajul de programare C poate NEP despresredstvenno gestiona memoria calculatorului. Pe
de altă parte, C și care posedă un nivel înalt caracteristici lingvistice, astfel încât programele C
să citească și să scrie mai bine decât un program în limbaj de asamblare. Limbajul C este foarte
ușor de utilizat pentru scrierea programelor de sistem, dar într - un program C pentru alte
scopuri, este adesea dificil de înțeles decât în Progra m max, scrise în alte limbi. Limbajul C
are , de asemenea , mai puține Ce pot Nost pentru verificarea automată a programelor decât
alte lang s nivel înalt de ki.
Pentru a depăși aceste și alte neajunsuri ale C, Bjarne strut t RUE de la AT & T Bell
Laboratories în 1980, a dezvoltat pe baza lui C ++ limbajul de programare. Cele mai multe C
reprezintă un subset al limbajului C ++ și, prin urmare, majoritatea programelor C sunt și
programe C ++. Programele în C ++, puteți utiliza texte în limba C și accesul la
funcții de bibliotecă C Limba EXC principală și Chiyo de C ++ de la C este de a
pune în aplicare programarea orientată spre obiecte - extrem de puternic
metoda de programare moderne.
După câțiva ani de utilizare practică C ++ sute Dl DART caietul de sarcini limba a
devenit de fapt , AT & T C ++ eliberare limbaj limbaj 2.0, dezvoltat de B. Stroustrup de la
compania Bell Laboratories AT & T. În prezent, Institutul Național American de Standarde
(ANSI) are un comitet pe limba C ++ (X3J16). O descriere a limbajului cu comentarii în 1990
a fost adoptată de comitetul ANSI ca material de bază pentru standardizarea C ++. Ultima
versiune a standardului este data de 26 mai 1994.
În prezent, se utilizează pe scară largă implementarea limbajului în Visual C ++,
Borland C ++ xx, Borland C ++ Builder x etc. În acest tutorial vom fi ghidați de versiunea
Borland C ++ 3.1.
2. Elemente ale limbii
2.1. Primele programe
Să scriem cel mai simplu program.

#include <iostream.h>
void main () {
cout << "Bună ziua, lume! \ n";
}

Aici, în primul rând, se numără așa-numita directivă preprocesor (inclusiv


directiva). Punerea în aplicare a acestui erektivy și va conduce la faptul că , în loc de prima
linie în program va fi inserat în fișierul iostream.h de conținut (fișiere cu
extensia .h nazyv și Heder sunt, sau fișiere antet, aceste fișiere conțin text scris în C ++) și
compilatorul după care se va ocupa de podea nou în textul chenny al programului.
În al doilea rând al codului sursă al programului există un antet al funcției cu
numele principal . Parantezele goale indică faptul că această funcție nu are argumente
și cuvântul cheie void înseamnă că principalul nu returnează nici o
valoare. Întăriturilor și dl hoditsya unitate, care este adesea numit corpul programului.
A treia linie este în valoare de operatorul a cărui acțiune - ieșire pe cout (în limba
engleză sună ca o vezi-out), care este asociat cu ERS și dl linia de afișare
Bună ziua, lume!
Caracterul "\ n" de la sfârșitul textului în citate informează compilatorul că după ce
textul este afișat pe ecran, mergeți la o linie nouă.
Acum vom prezenta un program simplu și dialog care punctul fasciculului pe
ecran, în cazul în care utilizatorul execută această Progra m - lea și introduce datele
relevante. În viitor, utilizatorul va fi numit persoana care utilizează
programul.Datele, utilizatorul e dennye secole sunt evidențiate în textul dialogului cu caractere
aldine. Programator, vom fi numit, desigur, autorul original.

#include <iostream.h>
void main () {
int m, n, suma; // Descrieri.
cout << "Pentru a introduce numere, introduceți două cifre pe tastatură \ n";
cout << "(separate prin spații), apoi pe E n ter \ n.";
cin >> m >> n; // Introduceți
numerele.
suma = m + n;
cout << "Pentru m =" << m << "și n =" << n
<< "suma lor este egală cu" << sum << ". \ N"; // Efectuați rezultatul.
}

Când executați acest program pe un ecran de computer ff va e suflare dialog:

Pentru a introduce numere, introduceți două numere pe tastatură


(Separate prin spații), apoi pe E n ter.
20 45
Pentru m = 20 și n = 45, suma lor este egală cu 65.

În acest program, // sunt comentate caracterele // . A treia linie descrie variabilele


întregi cu numele m, n și suma.
Operatorul începe cu cuvântul CIN spune compilatorului că valoarea introdusă de
utilizator de 20 și 45, ar trebui să fie plasate cu o responsabilitate în variabilele m și n. Cin
obiect (pronuntat see-in) - n de intrare curent - aici înțeleasă ca o tastatură, iar săgețile << și >>
decretul s direcția vayut în care este mutat datele.
Să ne îndreptăm acum spre descrierea limbajului C ++ și a capacităților sale.

2.2. Limba alfabetului


Limba alfabetului include
1) litere latine superioare litere A. .. Z
Literele latine cu litere mici a .. z
Cifre arabe 0..9
Caracterul de subliniere _ (este tratat ca o literă).
Toate aceste simboluri sunt folosite pentru a forma cuvinte cheie și nume ale limbii. Un
nume este o secvență de litere și numere care încep cu o literă și nu cu un cuvânt cheie. (_ La
începutul numelui nu este recomandat pentru a pune în etsya).
În C ++, literele majuscule și litere mici sunt diferite, astfel încât numele ARG1 și arg1
sunt diferite.
2) Alfabetul C ++ conține semne de punctuație și caractere speciale, după cum se arată
în Tabelul. 1.

Fața aia 1 b
Punctul și caracterele speciale

simboluri nume C m boi nume


. virgulă { deschidere paranteză
. punct } paranteză de închidere
; punct și virgulă < mai puțin
: colon > mai mult decât
? semn de întrebare [ deschidere paranteză
' apostrof ] paranteză de închidere
! exclamation point # număr
sau o soluție , astfel ka
|| % procent
/ slash & ampersand
\ backslash ^ NU logica
~ tildă - minus
* asterisc = egalitate
( deschidere paranteză " virgulele inversate
) paranteză de închidere + plus
3) Spațiul alb

Acest grup include spații, tab - uri, pagina traducerea ki, un retur de car, traducerea
paginii. Aceste simboluri separătoken-urile limbii. Orice secvență de caractere goale este
considerat în calculator și lyatsii ca un singur spațiu.

2.3. Comentarii
Comentariile sunt limitate la:
// la sfârșitul liniei.
sau așa:
/ * caractere
simboluri
...
caractere * /
Comentariul a personajelor - este nu numai literele alfabetului C ++, dar l u pa
simboluri posibile, inclusiv scrisori rusești.

2.4. Tipuri de date


Toate tipurile de date pot fi împărțite în două categorii: scalar și sa ridicat la Nye.

Cuvintele cheie utilizate în datele de reclamă și t principalele pansamente sunt:


pentru nu mai puțin de tipuri :
char, int, scurt, lung, semnat, nesemnat ;
pentru înot tipuri :
float, dublu, dublu lung ;
pentru clase : clasa uniunilor structurale ;
Pentru enumerare: enum ;
Pentru tipul void: void (gol).

2.5. Întregul tip de date


Introduceți caractere sau caractere
Tipurile de caractere sunt caractere diferite, iar valoarea acestor caractere este valoarea
numerică din codificarea internă a computerului.
O caracteristică constantă este un caracter închis în apostrofuri, dar un exemplu: '&', '4',
'@', 'a'. Simbolul "0", de exemplu, are o valoare ASCII de 48.
Există două modificări de acest tip: caracterele semnate și caracterele nesemnate .
Datele de caractere ocupă un octet și variază în intervalul:
semnat char ( sau doar char) -128 .. 127;
semn nesemnat 0 .. 255.
Rețineți că , dacă doriți să se ocupe de variabile, și a primit cerned cu valori de litere
rusești, tipul lor ar trebui să fieunsigned char, ca coduri de litere ruse> 127 (în codare ASCII).
Simbolurile, inclusiv cele non-grafice, pot fi reprezentate ca constante simbolice cu
ajutorul așa-numitei. controlul serial v Nosta.
Secvența de control - un combinații de caractere speciale, care încep cu \, urmat de
litera sau la combinații de numerele m ( a se vedea tabelul 2 ..).
Secvență „\ ddd“ și „\ XDDD“ vă permit să reprezinte orice caracter în computer stabilit
ca o secvență de octala sau shes cifre , astfel nadtsaterichnyh respectiv. De exemplu,
caracterele de retur pot fi specificate ca: '\ r' sau '\ 015' sau 'x00D'.
Fața aia
2b
Secvențe de control speciale
Prin controlul schaya - lea nume
V NOSTA de serie
\a apel
\b Reveniți la pas
\t Fila orizontală la lyatsiya
\n Linia de alimentare
\v TION verticală Tabula I
\z Returul călătoriei
\f Traduceți pagina
\" Citate
\' apostrof
\\ backslash
tip int ( echivalent) int intreg )
Datele de tip int ocupă 2 octeți și iau valori întregi din intervalul: -32768. . 32767.
Introduceți int unsigned
Datele de acest tip ocupă 2 octeți, intervalul lor: 0. . 65535.
Tastați lung ( lung int )
Aceste date ocupă 4 octeți și variază în interval
0. . 4298876555.
Rețineți că dacă un intreg din intervalul int , devine automat o constantă de tip lung sau
chiar nesemnat lung .
Deci, 32768 este de tip lung , 2676768999 este de tip unsigned long .
Puteți specifica tipul unei constante și explicit cu sufixele "U" și "L":
-6L 6U 33UL.
În standardul limbii, se definește numai că sizeof (char) = 1 și
sizeof (char) <= dimensiunea (scurtă) <= dimensiunea (int) <= dimensiunea (lungă).
Aici, sizeof (tip) - o operațiune care determină în ba - lea minut dimensiunea
de tip tip.
O constantă întreagă care începe cu un zero, este o constantă octal dar caractere incepand
0x - hexazecimal Consta nun exemplu
031 0750 01 - constante octale;
0x17 0xA9 0xFF - Constante hexazecimale.

2.6. Tipuri de date plutitoare


Informațiile privind datele tipurilor plutitoare, care reprezintă numere reale într - un
calculator, sunt prezentate în tabelul. 3.
Tabelul 3
Tipuri plutitoare
tip lungime Gama de Zecimale zecimale

plutitor 4 3.4e-38 .. 3.4e38 7


dublu 8 1.7e-308 .. 1.7e308 15
lung dublu 10 3.4e-4932 .. 1.1e4932 19
În mod implicit, constantele plutitoare sunt de tip dublu, în cazul în care nu vin cu
o serie de responsabil:
1,0, .3-6. 2.3e-6 (adică 2.3 ˙ 10 -6 ), 3e-19, 1.2 - de tip dublu .
Ɩ sufix indică faptul că constanta plutitoare are tipul lung dublu :
3 Ɩ , 3E8 Ɩ , 1.6e-19 Ɩ , 1.3e-200 Ɩ - dublu lungime .

2.7. Constante de coarde sau literali


O constantă string este o secvență de caractere luate în și din heap:
"String" "A + b = c \" este egalitatea "".
Un literal șir este reprezentat în memorie ca o serie de elemente de tip char .
Pentru comoditate, la compilare, caracterul nul '\ 0', care este caracterul de sfârșit de
linie, este adăugat automat la sfârșitul fiecărei linii. Astfel, în memoria literală „trei“
de Neem și nu trei, ci patru octeți.

2.8. Se definește directiva preprocesorului


Definiția directivei preprocesor este

#define Numele tekst_podstanovki, de exemplu, și măsuri


#define nmax 1000
#define km (nmax  3 + 1)

Numele specificat în #define în domeniul său de aplicare este înlocuit în textul


programului cu textul substituției.Astfel, în loc de numele nmax (în câmpul de vizibilitate),
1000 va apărea peste tot în text și în loc de km - (1000 * 3 + 1).
Rețineți că există o altă formă a directivei #define (cu parametrul a mi).

2.9. descriere
Toate variabilele trebuie descrise înainte de a le folosi. Opis constă dintr - un tip de
specificatorul , urmată de o listă de n Move GUVERNAMENTALE, care va avea un anumit
tip specificat:

int i, j, k, pmax;
flotați radix, a, b, s_m;
dublă k, kr;
char ch, ch1;
simbol char;

În descriere, variabila poate fi inițializată cu o anumită valoare, de exemplu:


char t = 't', BACKSLASH = '\\';
int i = 0, j, k, s = 1;
float ro, eps = 1e-6;

2.10. modificator const


Dacă numele anunțului este prezent modificatorul const, atunci când b CPC, care
cartografiat numele este considerat în al n - lea-existenta a numelui ca o constantă. De
exemplu :

const int = 50; // atunci La fel ca const i = 50;


const dublu pi = 3,14159;

Astfel de constante numite nu pot fi schimbate în program. Și pentru a utiliza aceste


constante, puteți , de asemenea, cade obicei.

3. Expresii
O expresie este o combinație între operanzi și operațiuni. Și Exemplul H:
a + b a / b c << d, etc.

3.1. Funcționarea și exprimarea misiunii


Operația de atribuire este notată cu simbolul ' = '
Cea mai simplă operațiune de atribuire este:
v=e
Aici v este orice expresie care poate lua o valoare, e este o expresie arbitrară.
Operația de atribuire este efectuată de la dreapta la stânga, adică în
primul e s valoarea expresiei calculat, iar apoi această valoare este atribuită
l e v vomu operanzi. Operandul stâng în operația de atribuire trebuie să fie așa-
numitul. expresie de adresă , care altfel este numită Ɩ -value . Notă e adresa de rom, sau
numele, expresia este numele variabilei.
Nu este o valoare Ɩ , de exemplu, expresia a + b.
Expresia adresei nu este niciodată constantă.
In C ++ formele de operare de atribuire limbaj de expresie adecvat și Bani, adică
a=b
Mijloacele de trimitere nu numai la o valoare b, dar , de asemenea , că a = b este o
expresie a cărei valoare este operandul stâng după ADECVAT Nia e.
Prin urmare, rezultă că, de exemplu, o astfel de înregistrare este posibilă:
a = b = c = d = e + 2;
Deci, rezultatul unei expresii de atribuire este e rand sa stanga op. Dacă tipul
operandului drept nu se potrivește cu tipul operandului din stânga, valoarea din dreapta este
convertită la tipul operandului stâng (dacă este posibil). În acest caz, pierderea poate apărea
znach e Nia, de exemplu:

int i; char ch;


i = 3,14; ch = 777;

Aici, am primește valoarea 3, iar valoarea 777 este prea mare pentru a fi reprezentat ca
un char, astfel încât valoareaCH va depinde de modul în care punerea în aplicare specifică
efectuează conversia dintr - o mai mare la un număr întreg mai mic.
Există așa-numita operațiune combinată pentru a atribui un aspect vizual

a op = b , aici op este semnul uneia dintre operațiile binare:


+ - * /% >> << & | ^ && ||.
atribuire

a op = b este echivalentă cu
a = a op b, cu excepția faptului că exprimarea adresei gândit am etsya doar o singură
dată.
exemple:
a+=2 și un sens a=a+2

bottom_count [2 * i + 3 * j + k] * = 2 și un sens bottom_count [2 * i + 3 * j + k] =


bottom_count [2 * i + 3 * j + k] * 2
s/=a și un sens s = s / a
Rezultatul operației de atribuire este operandul stâng; și , prin urmare, rezultatul său
este o expresie de adresă și, prin urmare, este posibil să se scrie
(a = b) + = c;
Aceasta este echivalentă cu următorii doi operatori:
a = b; a = a + c;
3.2. Operații aritmetice
Operațiile aritmetice binare sunt + - * /%.
(Există, de asemenea, un + și -).
Atunci când împărțiți întregi, partea fracționată este aruncată .
Deci, 10/3 dă 3, în timp ce 10 / 3.0 dă 3.33333 ...
Funcționare a% b se aplică numai pentru întreaga operanzii și face o tatok de
afaceri e Niya a lui b, așa
10% 3 dă 1,
2% 3 dă 2,
12% 2 dă 0.

3.3. Operații relaționale


Operațiile relației sunt = >> <= <.
Toți au aceeași vechime. În spatele lor, în funcție de nivelul de prioritate, se află
operațiunile de egalitate și inegalitate:
= = (egal),! = (nu egal) cu aceeași prioritate.
Operațiile relaționale sunt mai puțin decât operațiile aritmetice, astfel încât expresiile
m și na i <lim + 3 sunt înțelese ca i <(lim + 3).
Operația de comparare definește o anumită expresie. Valoarea acestei expresii este un
număr întreg 1 dacă condiția exprimată prin comparație este îndeplinită și este egală cu 0 , dacă
nu.

3.4. Operații logice


Operațiile logice includ:
operațiune unar o logică NU! (Negație);
operație binară logică AND, && (conjuncție);
operație binară, OR logică, || (Disjuncție).
operații logice operanzi pot fi numere întregi, plutitoare și n e sunt celelalte
tipuri, în timp ce în fiecare operațiune poate participa operanzii de diferite m și pansamente.
Operanzii expresiilor logice sunt evaluați de la stânga la dreapta.
Rezultatul operației logice este 0 sau 1 de tip int .
Operațiunea! Operand dă 0 dacă operandul este nenul și 1 dacă Rand op e n y este
egal cu lu.
Operațiunea && (logica ȘI, multiplicarea logică) dă znach e de 1 în cazul în
care ambii operanzi au non-valoare zero.Dacă unul dintre n rânduri de operă egal cu 0,
rezultatul este de asemenea egal cu 0. Dacă valoarea primului operand este egal cu 0, al doilea
operand nu este evaluat Xia m.
Operațiunea || (OR-logic, adăugare logică) produce o valoare 0 dacă ambii operanzi sunt
0. Dacă oricare dintre operanzi are o valoare nenulă, rezultatul operației este 1. Dacă primul
operand are o valoare nenulă, al doilea operand nu este evaluat.
În mod prioritar, aceste operațiuni sunt distribuite după cum urmează:!, &&, ||.

3.5. Operațiuni binare


Operațiile bit sau bit sunt:
funcționarea bițială ȘI;
operație de biți OR;
operatorul exclusiv OR de biți ^;
funcționarea unară a negării bitului.
În plus, sunt luate în considerare operațiile de schimburi <<, >>.
Operanzii operațiilor bit-bit pot fi de orice tip întreg.
Operațiunea & compară fiecare bit al primului operand cu m biți doilea
operand sootvets vuyuschim. În cazul în care ambii biți sunt una și Ci corespunzătoare, bitul
corespunzător al rezultatului este setat la 1, în caz contrar la 0.

Operațiunea | Se compară fiecare bit al primului operand cu m bit al doilea


operand sootvets vuyuschim; dacă unul sau ambele sunt egale cu 1, atunci bitul rezultat rezultat
este setat la 1, altfel la 0.

Operațiunea ^ . Dacă unul dintre biții comparate sunt egali cu 0 , iar celălalt este 1,
bitul corespunzător al rezultatului este setat la 1 într - o linie dreaptă Altfel, adică Atunci când
ambele biți sunt 1 sau ambele sunt 0, bitul de ieșire Stabilim șiINDICA 0.

Operația ~ modifică operandul de biți 0 cu 1 și 1 - cu 0.


Bitwise & adesea folosite pentru a masca un
anumit torogo al setului de biți de plural, de ex
C = N & 0177

Acesta transmite celor șapte biți mai puțin semnificativi ai C N, presupunând restul la 0. (C
primul zero în C ++ începe să constantele octale la 0X - hex și dtsaterichnye CONSTA n tine).
Să presupunem că N = 642. Se dă reprezentarea biților N, constanta octal 0177
și rezultatul C:

N 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0
0177 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1
C 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0

Operațiunea | Folosit pentru a permite biților:


C = N | MASK
stabilește la 1 acei biți în N care sunt 1 în MASK .

Mai multe exemple:


int a = 0x45ff, b = 0x00ff;
int c;
c = a ^ b; // c: 0x4500
c = a | b; // c: 0x45ff
c = a & b; // c: 0x00ff
c = ~ a; // c: -0x3a00
c = ~ b; // c: -0x7f00
Acest fragment al programului poate fi ilustrat după cum urmează:

o 0 1 0 0 0 1 0 1 1 1 1 1 1 1 1 1
b 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
c=a^ 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0
b
c=a|b 0 1 0 0 0 1 0 1 1 1 1 1 1 1 1 1
c=a& 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
b
c=~b 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0
Cu operare și poate fi determinată prin împărțirea reziduurilor op e rand
unsigned int tip 2, 4, 8, 16, etc. Pentru aceasta este suficient ca operatia sa fie
aplicata si divizibil cu masti 0x01, 0x03, 0x07, 0x0f, 0x1f, etc. H ca un exemplu:
7 și 0x03 dă 3.
Cu alte cuvinte, numărul alocat de biți mai puțin semnificativi, iar restul
au un tanavliv și sunt 0.

3.6. schimburi
<< >> operațiune de deplasare se realizează , respectiv , trecerea din stânga
și din dreapta a operandului stâng , în număr de poziții de bit definite de
drept și operandul vym. Astfel, X X << 2 schimburi spre stânga prin poziția 2
a unui biți plin părăsite cu zero, ceea ce este echivalent cu multiplicarea cu 4.
Valoarea deplasarea la dreapta , urmată de adăugarea de biți fără semn superior
cu zerouri. Deplasare la dreapta de o asemenea magnitudine pe n biți echiv un caz
de Postul Mare întreg e INJ operandul din stânga de 2 la puterea n .
De exemplu,
5 << 3 dă 40;
7 >> 2 dă 1.
Rețineți că operandul potrivit trebuie să fie constant exprimat și mâncat,
adică o expresie care include numai constante. Dacă operandul din dreapta este
negativ sau este mai mare sau egal cu numărul de biți de operă din stânga n da,
atunci schimba rezultatul nu este definit. Tipul rezultatului operației de schimbare
este tipul operandului stâng.
3.7. Autoincrement și operații de reducere automată ++ și - -
Aceste operațiuni sunt misiuni unare. respectiv Ele cresc sau scad valoarea
operandului la operandului 1 ar trebui să fie un număr întreg sau plutitoare de tip
punct (sau un pointer) și să fie expresia adresă constantă (adică fără
cuvântul const în inventar și NII). Tipul de rezultat corespunde tipului
de operă n da.
Forma prefixelor de operare:
++ operand - operand
Forma Postfix:
operand ++ operand .
Dacă semnul operației este înaintea operandului , rezultatul operației este
valoarea mărită sau scăzută a operandului . Rezultatul este expresia adresei
( Ɩ -value).
Dacă semnul operand este după operand , valoarea expresiei este
valoarea operandului . După ce se utilizează acest rezultat , valoarea
operandului crește sau scade. forma postfix Rezultatul opere și țiilor nu este Ɩ
- valoare.
Exemple :
int i = 0, j = 0, k, 1;
k = ++ i; // Aici k = 1 și i este 1;
l = j ++; // l = 0 și j devine 1;
- - k; // k = 0;
+ + j; // j devine 2.
Cu alte cuvinte, rezultatul executării
k = ++ i; la fel ca și în secvența operatorilor
i = i + 1; k = i;

Și rezultatul
k = i ++; la fel ca în
k = i; i = i + 1;

3.8. Funcționare ternară sau condiționată


Operația ternară, adică funcționarea cu trei operanzi are forma
operand1? operand2: operand3
Primul operand poate fi un întreg sau un tip plutitor (precum un element
pointer, referință sau enumerare). Pentru această operație, este important dacă
valoarea primului operand este zero sau nu. Dacă operandul
1 nu este 0, operandul 2 este evaluat și valoarea acestuia este rezultatul
operației. Dacă operand1 este 0, calculat operand3 și znach său e rezultatul
operației. Rețineți că fie operand2, fie operand3 este calculat , dar nu ambele.
Exemplu :
max = a <= b? b: a;
Aici, max variabila i se atribuie valoarea maximă a lui
n f Rem N GUVERNAMENTAL a și b.
Dacă operația condiționată operand2 și operand3 sunt vizate s expresiile
E, operarea ternare pot fi lăsate de drepte și svaiv și Nia:
un <b? a: b = c * x + d;
Aici, valoarea expresiei c * x + d este atribuită celei mai mici dintre cele
două variabile a și b.

3.9. Funcționare în secvență


Simbol operațiune de repetiție este , (virgula). Expresiile separate prin
acest simbol de la stânga la dreapta , în exact elementul pe rând în care
pe e numărul.
Rezultatul acestei operații este rezultatul ultimei expr e Nia. Dacă este o
expresie adresă, atunci rezultatul operației este , de asemenea , adresa
în s expresii.
exemple:
int a = 3, b = 8; c; // aici o virgulă este un delimitator, nu o operație;
c = a +, a + b; // aici și va fi egală cu 4, și cu 12;
(b -, c) * = 3; // aici b devine egal cu 7 și de la 36.
Operația de secvență este adesea folosită în instrucțiunea for . La
robinet h Nye parte din această declarație poate include mai multe expresii, de
exemplu , și măsuri pentru schimbările paralele în cei doi indici. Aceasta este
ilustrată de funcția REVERSE (S), care plasează șirul S în ordine inversă *** în
același loc.
void REVERSE (char S []) {
int C, I, J;
pentru (I = 0, J = strlen (S) -1; I <J; I ++, J -
C = S [I]; S [I] = S [J]; S [J] = C; }
}
În acest exemplu, strlen (S) este o funcție care calculează numărul de
caractere într-un șir S (fără caracterul '\ 0').
Virgulele că argumente diferite funcții, variabile în op și saniyah și așa
mai departe, nu sunt relevante pentru funcționarea virgulă și nu oferă calcul
la stânga domnului și dreapta.

3.10. Priorități de operare și ordine de calcul


Informații privind toate operațiunile de C ++ sunt prezentate pe scurt în cele
ce urmează este b -face 4:
Tabelul 4
Prioritatea operațiunilor și ordinea implementării acestora
Ex și preferință operație remarcă Ordinul
în s complemente
1 ::  . Activarea contextului, extragerea Stânga -
[] indexare ma cu Siva de exemplu , ca în
() funcția de apel Stânga -
() transformarea m și pa de exemplu , ca în
Stânga -
de exemplu , ca în
Stânga -
de exemplu , ca în
2 ++ - - ~! Dreapta -
-+ unary -, unary + numerar este, în
& obținerea unei adrese Dreapta -
* decretul de autorizare și de Tell numerar este, în
nou, lucra cu memorie Dreapta -
ștergeți dinamică I Tew numerar este, în
sizeof Definiția postat e ra Dreapta -
numerar este, în
Dreapta -
numerar este, în
Dreapta -
numerar este, în
3 * multiplicare Stânga -
/ diviziune de exemplu , ca în
% soldul Stânga -
de exemplu , ca în
Stânga -
de exemplu , ca în
4 * . * extracție Stânga -
de exemplu , ca în
5 + adăugare binară Stânga -
- Binar scăderii și a de exemplu , ca în
Stânga -
de exemplu , ca în
6 << >> schimburi Stânga -
de exemplu , ca în
7 << => => comparație Stânga -
de exemplu , ca în
8 = =! = nu este egal cu Stânga -
de exemplu , ca în
9 & bitwise AND Stânga -
de exemplu , ca în
10 ^ XOR (exclusiv OR) Stânga -
de exemplu , ca în
11 || bit OR Stânga -
de exemplu , ca în
12 && Și - logic Stânga -
de exemplu , ca în
13 || SAU - logic Stânga -
de exemplu , ca în
14 ?: funcționare ternară Dreapta -
numerar este, în
15 = * = / =% operație corespunzătoare e Nia Dreapta -
= + = și așa numerar este, în
mai
departe.
16 . urmări Stânga -
de exemplu , ca în
Prima prioritate este cea mai mare. Cele mai multe dintre operațiunile
din s este îndeplinită de la stânga la dreapta. De exemplu, expresia a + b + c fost
atribuită m Xia ca (a + b) + c. Excepție fac operații unare și operațiuni
de atribuire: care se execută de la dreapta la stânga: a = b = c în s este satisfăcută
atât a = (b = c).
Dacă doriți să modificați ordinea acțiunilor, se aplică paranteze.
expresie
7. a + b / -c este interpretată ca
(7. a) + (b / (- c)).
Puteți modifica această comandă:
7. (a + b) / (-c).
Trebuie remarcat faptul că expresiile, care includ unul dintre binare
op e radio + & ^ |, pot regrupa compilator, chiar dacă acestea sunt închise în
paranteze. Pentru a asigura ordinea corectă s calcul poate utiliza calcule
intermediare explicite. În C ++, ordinea de calculare a operanzilor într-o expresie
nu este fixată. De exemplu, în
c = sin (a x + b) + fabs (x);
primul operand poate fi calculat, apoi cel de-al doilea și poate invers. În cazuri
simple nu contează. Dar dacă neo b mers pe jos o anumită ordine, este necesar să
se introducă Mutare intermediar n Nye.

4. Operatorii
În C ++, un punct și virgulă reprezintă un semn al sfârșitului instrucțiunii.

4.1. O declarație goală constă din ;


Declarația goală este utilizată în cazul în care regulile limbii trebuie să fie
amplasate orice operator, iar logica programului nu este nimic ful l nyat nu
sunat și înainte.

4.2. Operatorul expresiei


Orice expresie a urmat ; , este un operator. T și operatorul Coy n și se
numește declarație de expresie .
Exemple :
i ++;
a = b + c;
c + = (a <b)? a: b;
x + y; // Aici rezultatul nu este folosit
// și va fi emis WARN bine denie.

4.3. Operatorul compozit


Un operator compozit este altfel numit bloc. El este Fra g program
de MENT de text, între paranteze și , de obicei , combină mai mulți
operatori. Compusul declarație trebuie și să utilizeze, în cazul în care sintaxa
necesită prezența unui singur op e Rathor și program logic - doar câteva:
{i = 5; c = păcat (i x); c ++;} // Acesta este un bloc.

4.4. publicitate
În C ++ operatorii de limbă sunt anunțuri și pot sta în cazul în care
caracteristici extinse ale soțiilor oricărui alt operator C ++:

s = 0,3; d / = s; int k = 5;
d = s + 2 * k;
dublu f = s + d; f = k;
4.5. Declarație condiționată
Există două forme de declarație condiționată:
1) dacă operatorul ( expresie )1
2) dacă ( expresie ) operator1 altă declarație2
Statement1 este executata daca expresia ia n th zero. Dacă expresia
este evaluată la 0 (sau pointer NULL), apoi statement2 .
Exemple :

dacă (a> b) c = a - b; altfel c = b - a;


dacă (i <j) i ++; altfel {j = i - 3; i ++;}
Dacă utilizați declarații imbricate dacă altceva curent se referă
întotdeauna la cea mai recentă dacă , care nu a fost încă cartografiată la altceva .
void main () {
int = 2, b = 7, c = 3;
dacă (a> b) {dacă (b <c) c = b;}
altfel c = a;
cout << "c =" << c << ". \ n";
}
Aici rezultatul este rezultatul șirului c = 2 .
Dacă omiteți armăturile în instrucțiunea if , atunci programul
pr și formularul met

void main () {
int = 2, b = 7, c = 3;
dacă (a> b)
dacă (b <c) c = b;
altfel c = a;
cout << "c =" << c << ". \ n";
}
În cazul în care altcineva aparține celui de al doilea if .
Ca rezultat, linia c = 3 va fi afișată .

4.6. Operatorul de selecție a comutatorului


Acest lucru permite operatorului să transfere controlul la una din mai multe
declarații tag - uri marcate în funcție de valoarea întreagă n expresie
Nogo. Etichetele declarației de comutare au un formular special:
cazul integer_constant :

Tipul comutatorului operator :


comutator (expresie_întreg) {
[Ad]
[case constant_are_expression1:]
...

[caz constant_integer_expression2:]
[Operatorii]
...
[cazul constant_integer_expresiune m:]
...
[caz constant_integer_expression n:]
[Operatorii]
[implicit:] [operatori]}

Aici [] indică o parte opțională a instrucțiunii și ... indică faptul că


construcția specificată poate fi utilizată de câte ori doriți. Block
după comutator () este numit s vayut operator de corp comutator .
Schema de execuție a operatorului:
În primul rând, se calculează expresia din paranteze (apel cu e le un torus).
Apoi, valoarea calculată a selectorului secvențial compară t Xia la
un dl expresie stantnym după caz .
Dacă selectorul este orice expresie constantă, o sută , eu prezint pentru un
caz , controlul este transferat la declarația etichetată acc t operatorii
corespunzând unui caz .
Dacă selectorul nu coincide cu o variantă de realizare etichetă,
controlul este, de banda e este dată de către operator, cuvântul etichetat implicit .
În cazul în care implicit nu este, controlul este transferat
în urma comutator op e operatori.
Rețineți că, după ce controlul este transferat pe oricare dintre etichete,
operatorii sunt executați succesiv. Prin urmare, dacă trebuie doar să efectuați o
parte din ele, trebuie să aveți grijă să părăsiți comutatorul . Acest lucru se face
de obicei cu ajutorul operatorului instructiune break , care impl e stvlyaet
ieșirea imediată din corpul operatorului declarație comutator .
Exemplul 1:
int i, d;
cout << "Setați valoarea întregului i \ n";
cin >> i;

comuta (i) {
cazul 1: caz2: caz3: cout << "i =" << i << "\ n";
cazul 4: cout << "i =" << i << "i ^ 2 =" << i i << "\ n";
d = 3 i - 4; cout << "d =" << d << ". \ n";
pauză;
cazul 5: cout << "i = 5. \ n"; pauză;
implicit: cout << "Valoarea i este mai mică de 1 sau mai mare de 5. \ n";
}
Dacă este introdus un număr 2, acesta va fi imprimat
i=2
i=2i^2=4
d = 2.
Dacă i este 4, va fi afișat
i = 4 i ^ 2 = 16
d = 8.
Când i = 5, se afișează
i = 5.
Pentru toate celelalte valori ale lui i va fi imprimat
Valoarea lui i este mai mică de 1 sau mai mare de 5.
Exemplul 2:
caractere;
int x, y, z;
cout << "Setați semnul de operare + - * / \ n";
semnul cin >>;
cout << " Set x și y \ n ";
cin >> x >> y;
comutator (semn) {
cazul "+": z = x + y; pauză;
cazul "-": z = x - y; pauză;
cazul '*': z = x * y; pauză;
case / ': dacă (y = = 0) {cout << "Nu poți împărți cu zero! \ n"; ieșire (1);}
altfel z = x / y; pauză;
implicit: cout << "Operație necunoscută! \ n"; ieșirea (1);
}
Aici, ieșirea (1) este un apel către o funcție care determină oprirea
programului imediat.

4.7. Operatorul buclă în timp


Operatorul ciclului cu o condiție prealabilă are forma
în timp ce declarația ( expresie )
Operatorul este numit corpul ciclului.
Atunci când execută un astfel de operator, valoarea expresiei este evaluată
mai întâi . Dacă este 0, atunci instrucțiunea nu este executată și controlul este
transmis operatorului care o urmează. Dacă valoarea expresiei a t personal de la
0, atunci operatorul se calculează apoi din nou exp e de , etc.
Este posibil ca corpul bucla să nu se execute o dată dacă expresia este
imediat egală cu 0.
Exemplul 1:
char cu ;
în timp ce (cin.get (c)) cout << c;
Aici, caracterele, inclusiv spațiile albe, sunt copiate din fluxul cin (în acest
caz, din bufferul tastaturii) în fluxul cout (în acest caz, pe ecranul de afișare). Aici
funcția get (c) (membru al clasei) extrage un caracter din fluxul de intrare,
inclusiv caracterele spațiului liber. Returnează o valoare nenulă până când ajunge
la sfârșitul fișierului (pr și caracterul final al fișierului este ctrl-z).

Exemplul 2:
în timp ce (1) {operatori ...}
Acesta este un ciclu infinit.
Exemplul 3:
char c;
în timp ce ((c = cin.get (c)) = = '' || c = = '\ n' || c = = '\ t');
Această instrucțiune de buclă creează așa-numitele spații albe când citesc
din fluxul cin . Aici, get () este o altă formă a unei funcții care citește un caracter
din flux. Se returnează un număr întreg - cod de caractere, sau numărul 1, în cazul
în care te întâlnești cu un semn domnului fișier tsa.

4.8. O buclă cu o condiție post - condiționată


Această instrucțiune de buclă verifică starea finală la sfârșit, după fiecare
trecere prin corpul bucla; astfel încât corpul buclei este întotdeauna executat cel
puțin o dată.
Tipul operatorului:
face declarația ( expresie )
În primul rând operatorul , atunci expresia este evaluată, și e cu dacă este
vorba despre t de la zero, declarația este executată din nou, etc.
Dacă expresia devine zero, bucla se termină.
Acest ciclu este util, de exemplu, să fie folosit la verificarea de intrare
de utilizator și a datelor Telem:
int intrare = 0;
int minvalue = 10, maxvalue = 150;
do {cout << " Introduceți valoarea de intrare \ n"; cin >> intrare;
cout << "input =" << intrare << "\ n"; }
în timp ce (intrare <minvalue || input> maxvalue);

4.9. Instrucțiunea pentru


Această instrucțiune buclă are forma:
pentru ( operator1 expres1; expres2 ) operator2
Operator1 poate fi un anunț gol operator sau op e Rathore-exp e Niemi.
Cel mai obișnuit caz este atunci când operatorul1 și expresia2 sunt
asignări sau apeluri către funcții, iar expresia1 este o expresie condiționată. Acest
ciclu este echivalent cu următoarea Konstr la TION:

operator1
în timp ce ( expression1 ) { statement2 expression2 ; }
Uneori, un operator1 este numit inițializator de buclă, iar expresia2 este o
reintroducere și un blocaj.
Oricare dintre cele trei părți pot fi omise, deși punctul este de a cruța - mi că
trebuie să rămână. Dacă nu există nicio verificare, adică expresia1 , atunci se
consideră că expresia1 a m este personal de la 0, așa că
pentru (;;) {. . . } este o buclă infinită și trebuie anulată într-un fel.
Exemplul 1:
int n = 20, s = 0;
pentru (int i = 1; i <= n; i + +) s + = i i;
Aici se calculează suma pătratelor de întregi de la 1 la 20.
Exemplul 2:
duble s, suma, den = 0,85, eps = 1e-10;
pentru (s = 1, suma = 0; s> eps; s = den) suma + = s;
Aici, suma progresiei geometrice se calculează 1, 1 0,85,
1 0,85 0,85, etc., până când următoarea sa durată devine mai mică de 10 -10 .
În exemplul următor, vom calcula și de ieșire la masa de afișare și funcția
zu pentru etapele .

#include <iostream.h>
#include <math.h>
#include <conio.h>
void main () {
int n = 10;
dublă x0 = 0, xk = M_PI_2, y ,
h = (xk - x0) / n, xt = xk + h / 2;
clrscr ();
cout << "xy \ n"
pentru (dublu x = x0; x <x; x + = h) {
y = sin (x * x);
cout.width (4); cout.precision (2);
cout << x;
cout.width (10); cout.precision (4);
cout << y << '\ n';
}
}

Acest program utilizează constanta M_PI_2, care reprezintă


valoarea și este definită în fișierul antetului math.h. Apelarea funcției
cout.width ( k ) stabilește lățimea câmpului de ieșire următor la pozițiile k , ceea
ce face posibilă alinierea vizualizării tabelului. Funcția cout.precision ( k )
specifică numărul de cifre care trebuie afișate după punctul zecimal. Funcția clrscr
(), al cărei prototip este în conio.h, șterge ecranul.
Indiferent dacă se utilizează în timp sau pentru bucle este, practic, o
chestiune de gust. Ciclul for este preferabil acolo unde există o simplă inițializare
și reinitializare, deoarece în acest caz, operatorii de control al buclă sunt puse
vizual împreună la începutul buclei. Acest lucru este cel mai och e de design văzut
pentru (i = 0; i <n; i ++),
care este utilizat pentru prelucrarea primelor n elemente ale șirului,
anal aproximativ -technology pentru un ciclu operator de Pascal. Analogia,
cu toate acestea, nu este completă, deoarece limitele ciclului pot fi schimbate în
interiorul buclei, și de control pe e dine își păstrează valoarea sa după ieșirea din
ciclu, indiferent de cauza acestui comunicat.

4.10. Operatorul ramurii necondiționate


Declarație de salt Necondiționat are forma goto eticheta ;
O etichetă este un nume urmat de un ' : '. Acest operator transmite
controlul operatorului marcat cu eticheta specificată. Cu ajutorul acestuia, este
convenabil să ieșiți dintr-o dată de la mai multe cicluri imbricate:
pentru (i = 0; i <n; i ++)
pentru (j = 0; j <m; j ++)
pentru (k = 0; k <l; k ++) {
operatori;
dacă (condiție) a ajuns la laborator;
operatori;}
laborator:; . . .
Cu instrucțiunea "geto", puteți merge din afară spre corpul blocului, dacă
controlul nu este trecut prin declarațiile de nume care sunt prezente în acest bloc.

4.11. Declarația de pauză


Această declarație iese din corpul buclei pentru , în timp ce , do-
while operator sau comutator declarație , în care a apărut. În același timp , pe
gestionarea e dat la prima op e Rathore după ciclu.
Operatorul nu poate oferi o ieșire de la două sau mai multe este un qi
conjugat la pescuit.

4.12. Declarația continuă


Această afirmație face o tranziție de la un punct imediat după ultimul ciclu
al corpului fără ca operatorul din bucla, astfel încât iterații suplimentare în ciclul
va Prodo l Huddle.
Exemplu de ieșire de numere par:
pentru (int num = 0; num <100; num ++) {
dacă (num% 2) continuă;
cout << num << "\ n";
}
Când num devine impar, expresia num% primește valoarea 1, 2, și execută
instrucțiunea care trece controlul la urmatoarea e suflare iterație a buclei pentru ,
fără a efectua ieșire.

4.13. operatorul de retur


Această afirmație se încheie executarea funcției în care este stabilit, și
sa întors ca un control la funcția de apelare.
Controlul este trecut la funcția de apelare la punctul neposre Dr. traseu
guvernamental lea conductor pentru provocare.
În cazul în care randamentul este prezent în principal funcția (), se
numește Remontă s vanie efectuate e programul Nia.

5. Indicatori
5.1. Definiția pointers
Un pointer este o variabilă care conține adresa unui obiect, de exemplu o
altă variabilă. Mai precis - adresa primului octet al acestui obiect. Acest lucru
permite accesul indirect la obiect printr - un decret și Tel. Fie x o variabilă de
tip int . Să desemnam px ca un pointer. Una p Nye & operatorul emite un obiect
adresă, astfel încât operatorul
px = & x;
atribuie adresa variabilă px a variabilei x . Se spune că px „Arătând și este“
pe x . Operația & este aplicabilă numai expresiilor de adresă, deci construcțiile
formulei & ( x- 1) și & 3 sunt ilegale.
operațiune unar numit razadresatsii operațiune sau opere și rezoluția
adresa TION. Această operațiune tratează operanzilor și modul în care ei e res și
se referă la această adresă pentru a prelua obiectul conținut la această adresă.
Prin urmare, dacă y are și tipul int , atunci
y = px;
Acesta atribuie y conținutul care este indicat de px . Astfel, urmașii lui s Nosta
px = & x;
y = px;
atribuie y aceeași valoare ca și operatorul
y = x;
Toate aceste variabile trebuie descrise:
int x, y;
int px;
Ultimul este o descriere a indicatorului. Acesta poate fi considerat ca
plural e monic. Se spune că combinația de px este de tip int sau, altfel, px este
un pointer la int . Aceasta înseamnă că dacă px apare ca px , atunci acesta este
echivalent cu o variabilă de tip int .
Din descrierea indicelui, rezultă că poate indica doar un anumit tip de obiect
(în acest caz int ). Razadresovanny decret și Tel poate introduce orice expresie
în care un obiect poate apărea tipul la care Indicând pointer ca este. Astfel,
operatorul
y = px + 2;
atribuie valoarea y , 2 mai mult decât x .
Rețineți că operațiunile unare prioritatea și k este de așa natură încât
op e radioul legat de operanzii lor mai bine decât operatorii aritmetici, astfel încât
regex și tensiune
y = px + 2
ia valoarea indicat de px , adaugă 2 și atribuie rezultatele s variabila TAT y .
Dacă pixelul indică x , atunci
px = 3;
presupune x egal cu 3, și
px + = 1;
crește cu x cu 1, precum și expresie
( px) ++
Sunt necesare paranteze aici. Dacă le omite, adică, pui de somn și
se așeză px ++, apoi, pentru că operatorii unari ca și ++ efectuează eu sunt
pe dreapta - la stânga, va crește expresia px , mai degrabă decât variabila la care.
Dacă py este un alt pointer la int , puteți efectua o sarcină
py = px;
Aici adresa de la px este copiată în py . În consecință, py indică la fel
ca px .

5.2. Pointeri și matrice


Array - o colecție de elemente de același tip, care este pulverizat pe lozheny
în n și memorie RAM de calculator într - un rând, unul după altul.
Semnul declarației matricei este paranteze pătrate. Ob am construi o
matrice de 10 elemente de tip float pot fi după cum urmează:
flotați un [10];
Pentru a se referă la un element de matrice, trebuie să aplicați op e radio
de indexare a [ ind ]. În interiorul parantezelor pătrate , este plasată întreaga
expresie, numită index. Numerotarea elementelor Ma la Siwa începând cu 0 , și
, prin urmare , descrierea de mai sus indică faptul că memoria calculatorului este
rezervat un loc în cele 10 variabile de tip float , iar aceste variabile
au o [0], o [1]. . . , a [9].
Iată un exemplu folosind un matrice.
Scrieți un program de numărare numărul de apariții ale fiecărei cifre,
etc de cablare de caractere de pescuit și toate celelalte personaje.
Numărul de caractere din spațiul alb va fi stocat în nwhite ,
celelalte simboluri pentru captură sunt în nother , iar numărul de apariții pentru
fiecare dintre cifre este în matricea ndigit :
#include <iostream.h>
void main () {
int c, i, nwhite = 0, altul = 0;
int ndigit [10];
pentru (i = 0; i <10; i ++) ndigit [i] = 0;
w h ile ((c = cin.get ())! = EOF)
dacă (c> = '0' && c <= '9') ++ ndigit [c - '0'];
altfel dacă (c = '' || c = = '\ n' || c = = '\ t') ++ nwhite;
altfel ++ nother;
cout << " numărul \ n";
pentru (i = 0; i <10; i ++)
cout << i << "a intrat " << ndigit [i] << " ori \ n";
cout << "caractere spațiu alb -" << nwhite << "alte caractere -"
<< notter << "\ n"; }
Când declarați o matrice, o puteți inițializa:
int c] = {1, 2, 7, 0, 3, 5, 5};
char array [] = {'h', 'e', 'l', 'l', 'o', '\ n', '\ 0'};
Ultima initializare este permisa sa fie mai simpla:
char array [] = "salut \ n";
Această sintaxă de inițializare este permisă numai pentru șiruri de
caractere. Comp și se calculează trimmer dimensiunea necesară a memoriei pe
baza adăugat automat la sfârșitul șirului de caractere „\ 0“ cu codul 0, care este un
semn al legăminte p liniei sheniya.
In C ++, un nume de matrice este un pointer constant la primul element al
podelei din al doilea șir:
int mas [20];
int pmas;
pmas = & mas [0];
Ultima declarație poate fi de asemenea scrisă: pmas = mas;
Operația de indexare a matricei [] are două operanzi - numele
maselor și wa, adică un pointer și un index, adică integer: a [ i ]. În C ++,
orice pointer de expresie [index] este, prin definiție, tratat ca
( index + index )
și este automat convertit la acest tip de compilator.
Astfel, un [ 3 ] este echivalent cu ( a + 3 ). Mai mult, acest lucru poate
fi scris chiar și așa 3 [ a ], pentru că acest lucru va fi în continuare interpretat
ca ( 3 + a ). Aici se adaugă indicatorul a și întregul 3 . În legătură cu
aceasta , considerăm așa-numita aritmetică adresă.

5.3. Adresa aritmetică


Pointerul poate fi adăugat la întreg.
Dacă un pointer pa adăugat întreg increment i , incrementează e de
dimensiunea memoriei scalate ocupat de obiectul la care punctele pointer pa .
Astfel, pa + i - e este i -lea element de după pa , în care MF și topirea,
dimensiunea acestor i elemente egale cu dimensiunea obiectului pe
pisica despre ing puncte pa .
Deci, dacă a este o matrice, atunci
a + i este adresa elementului i al acestei matrice, adică
& a [i] este egal cu a + i și a [i] egal cu (a + i).

float b [10];
float pb = b;
pb ++; // Aceasta este echivalentă cu pb = pb_1.
// Aici indicatorul pb va indica
// pe elementul matricei b [1].
pb + = 3; // Aici pb indică elementul matricei b [4].

Rețineți că nu puteți scrie b ++ sau b = b + i , deoarece numele


matricei b este un decret constant și nu poate fi schimbat.
Pointerii pot fi comparati.
Dacă p și q indicați elemente de aceeași matrice, apoi T și Kie relație <> =,
etc. să lucreze în mod corespunzător. De exemplu , și măsuri
p <q
adevărat, adică = = 1 dacă p indică un element anterior al matricei decât q . Orice
pointer poate fi comparat cu egalitatea sau inegalitatea cu un așa numit
pointer NULL , care nu indică nimic. Cu toate acestea, nu este recomandat pentru
a compara indicii care indică la robinet h matrice Nye.
Pointerii pot fi scosi.
Dacă p și q indică elemente ale aceleiași matrice, atunci p - q dă
numărul de și onoruri elementele de matrice dintre p și q .

5.4. Caractere și șir de caractere


Un șir este o serie de caractere. Valoarea șirului este un pointer la primul
caracter al șirului:
char string = "string \ n";
Aici indicatorul pentru caracterele de șir va conține adresa primului
caracter "c" al liniei "string \ n", care se află într-o anumită zonă de memorie
începând de la această adresă:

șir cu T r despre la și \n \0

Aici șir [3] = = 'o'.


Luați în considerare fragmentul programului:
tampon de caractere [] = " "; // Initializeaza
// linii cu 10 spații.
char * string = tampon; // șir indică începutul tamponului.
string = "test \ n"; // Alocarea!
Când se inițiază, șirul de buffer este creat și caracterele sunt plasate (aici
sunt 10 spații). Inițiarea char * string = buffer este setată pentru
a introduce indicatorul de șir la începutul acestei linii.
Operațiunea aceeași misiune în ultimul rând , nu copiază pref e șir -
degenerate „probă \ n“ în matrice tampon " , și modificați valoarea
indicatorului șir , astfel încât acesta începe să arate la șirul«probă \ n»:

tampon \0

n r despre b și \ n \ 0
șir
Pentru a copia șirul " sample \ n " în tampon , puteți face acest lucru:
char buffer [] = " „;
char p = " eșantion \ n";
int i = 0;
în timp ce ((tampon [i] = p [i])! = '\ 0') i ++;
Sau așa :
char buffer [] = " "
char p = " eșantion \ n";
char buf = tampon;
în timp ce ( buf ++ = p ++);
Aici, prima p este copiată la buf , adică Simbolul "n" este copiat la
adresa buf , care coincide cu adresa tampon , adică tamponul [0] devine
'n'. Apoi, indicatorii p și buf sunt incrementați , ceea ce duce la o " sonda \ n " și
la avansarea tamponului de -a lungul liniilor . Ultimul caracter copiat este '\ 0',
valoarea lui este 0, iar instrucțiunea while se oprește.
Chiar și mai ușor de utilizat funcția de bibliotecă, un prototip pentru o Tora
încearcă să ditsya fișier string.h :
strcpy (tampon, "proba \ n");
Când este necesară copierea pentru a se asigura că volumul
memoriei s împărțit printr - un tampon , a fost suficientă pentru a stoca șirul
copiat.

5.5. Seturi multidimensionale


O matrice bidimensională este tratată ca o serie de elemente, fiecare dintre
ele fiind o matrice unidimensională. 3D - ca matrice, ale căror elemente sunt
matrice bidimensionale etc.
După anunț
int a [5] [6] [7];
următoarele expresii pot apărea în program:

a [i] [j] [j] - obiect de tip int;


a [2] [0] - obiect de tip int * - matrice unidimensională de 7
numere întregi;
a [1] - matrice bidimensională de 6 * 7 = 42 de numere
întregi;
o - matricea tridimensională însăși.
Deoarece elementul matrice A este un pa subarray bidimensională a mer 6
* 7, apoi , sub expresia a + 1 este deplasată cu valoarea elementului matrice a ,
și anume trecerea de la un [0] la un [1]. Valoarea adresei este mărită cu 6 * 7 *
sizeof (int) = 84.
Pentru matrice bidimensională mas expresie mas [ i ] [ j ] este interpretată
ca * (* ( mas + i ) + j ). Aici mas [ i ] - pointer const în i MA rând th cu siva mas .
În memorie, matricele sunt stocate în rânduri, adică la accesarea e e mente
în ordinea în care apar în memoria cea mai rapidă schimbare și
din dreapta n DEX.
Deci, pentru o matrice c [2] [3], cele șase elementele sale sunt localizate în
memorie astfel:
c [0] [0] c [0] [1] c [0] [2] c [1] [0] c [1] [1] c [1] [2].
matrice multi-dimensionale pot fi , de asemenea , inițializat la
Opis si Institutul de Cercetare:
int d [2] [3] = {1, 2, 0, 5};
În acest caz, primul element al șirului va avea 4 listat znach e Nia și pe la tal
doi inițializat la zero.
Dacă inițializa o matrice multidimensională, atunci prima ra z dimensiune
poate fi omisă. În acest caz, compilatorul însuși calculează dimensiunea
maselor și va:
int f [] [2] = {2, 4, 6, 1}; // array f [2] [2];
int a [] [2] [2] = {1, 2, 3, 4, 5, 6, 7, 8}; // array a [2] [2] [2].
Expresia de inițializare poate avea o formă care reflectă faptul că
matricea este , de exemplu, bidimensională:
int c [2] [3] = {{1, 7}, {-5, 3}};
În acest caz , coloanele zero și prima sunt inițializate în matricea c , iar a
doua coloană, adică este inițializată. Elemente de c [0] [2] și c [1] [2] -
Initializam și zerouri ruetsya.

5.6. Indicatori și matrice multidimensionale


Luați în considerare diferența dintre obiectele A și b , descrise după cum
urmează th conductiv arr un mod:
int a [10] [10];
int * b [10];
Și a și b pot fi utilizate într - un mod similar , în sensul că, ca un [5] [5]
și b [5] [5] sunt accese separate la o valoare de tip int . Dar o - o matrice
adevărată: este dat de 100 de celule de memorie și de a găsi orice element
specificat este de obicei efectuată Comput cu Lenia indici care necesită
multiplicare. Pentru b, descrierea alocă numai 10 indicatori. Fiecare dintre ele
trebuie să fie stabilită astfel încât să fie la o serie de n e împerecheat.
Presupunând că fiecare dintre ele indică o serie de 10 elemente, atunci
undeva vor fi alocate 100 de celule de memorie plus 10 mai multe celule pentru
pointeri. Astfel, o serie de indicii utilizează n e mult mai multă memorie și poate
necesita prezența unui pas de inițializare explicită. Dar , în acest caz , există două
avantaje: acces la Elem n care se realizează în mod indirect printr - un pointer, și
nu prin multiplicarea și adăugarea, iar liniile solide pot avea lungimi
diferite. Aceasta înseamnă că fiecare element b nu trebuie să indice neapărat un
vector de 10 elemente. Această diferență poate fi văzută în exemplul următor.
zi char [5] [12] = {
"Luni", // Fiecare linie are 12 caractere.
„Marți,“
"Medium"
„Joi,“
„Vineri“
};
Există indicii constante zi [0], ziua [1], ..., ziua [4] cesta că
adresa și memoria stki lungime egală, la fiecare 12 octeți:

zi zi +1 zi + 2 zi + 3 zi + 4

char * day1 [2] = { "Sâmbătă", // 7 caractere + '/


0'
"Duminica,"}; // 11 caractere + '/
0'
zi1 [0] ziua1 [1]

cu la b b despre T și \ în despre cu la r e cu e n s e \
0 0

Aici, indicatorii day1 [0] și day1 [1] adresează locațiile de memorie,


respectiv la 8 și 12 octeți.

S-ar putea să vă placă și