Conventii lexicaleai.pub.ro/resources/files/PC/PC3.pdf · Conventii lexicale 4. Operatori...
Transcript of Conventii lexicaleai.pub.ro/resources/files/PC/PC3.pdf · Conventii lexicale 4. Operatori...
Conventii lexicale:
In limbajul C++ exista 5 categorii lexicale (tokens) = entitati lingvistice
care au semnificatie sintatica pentru compilator:
1. Nume (name) / Identificatori (identifiers)
2. Cuvinte cheie (keywords)
3. Literale (literals)/ constante
4. Operatori (operators)
5. Semne de punctuatie (punctuators), incluzand: Separatori
(separators)
Conventii lexicale
Spatii albe (white spaces) → multimea caracterelor:
• spatiu (blank),
• tabulatori orizontali si verticali (tabs),
• linie noua (new line),
• caractere de formatare (formfeeds) si
• comentariile (def.: /* sir caractere */ sau // linie )
Spatii albe sunt ignorate si eliminate din codul sursa in etapa de
compilare, cu exceptia situatiei când folosesc pentru separarea a 2
entitati lexicale.
Un spatiu alb este necesar pentru separarea identificatorilor, a
cuvintelor-cheie si a constantelor.
Conventii lexicale
1. Nume (name) / Identificatori (identifiers) → secventa de lungimeoarecare de litere si cifre, primul caracter sa fie litera sauunderscore (’_’).
Obs.: C++ este limbaj “case sensitive”, literele mici sunt diferite de literele mari corespunzatoare.
Ex.:
int diferit de Int diferit de INT
Toate caracterele unui identificator sunt semnificative.
Identificatorii care incep cu 2 caractere underscore (de ex.: _ _nume ) sunt utilizati de compilator, motiv pentru care se evita definireaunui astfel de nume
Conventii lexicale
2. Cuvinte cheie (keywords) → nume rezervate limbajului, care
semnifica diferite comenzi, operatii, functii si nu pot fi folositi in
alt scop
asm auto bool break case catch
char class const continue default delete
do double else enum extern false
float for friend goto if inline
int long namespace new operator private
protected public register return short signed
sizeof static struct switch template this
throw true try typedef union unsigned
using virtual void volatile while
Conventii lexicale
3. Literale (literals) / constante → valori fixe, pe care programul /
compilatorul NU le poate modifica.
Ex.: int a = 3;
float b = 5.78;
char c = ‘v’;
char *sir = ”sir de caractere”;
a = a + 5;
NU trebuie confundate cu
notiunea de variabila constanta!
Conventii lexicale
A. Constante intregi →succesiune de cifre (fara punct zecimal)
- Modificarea bazei in care sunt scrise (interpretate) constanteleintregi, se face folosind prefixele: 0, 0x, 0X.
Astfel avem:
constanta zecimala (in baza 10), daca NU incepe cu 0
Ex.: 1245
constanta octala (in baza 8), daca incepe cu 0:
Ex.: 01245
constanta hexazecimala (in baza 16), daca incepecu 0x sau 0X:
Ex.: 0x1245 sau 0X1fab3
TEMA: Sa se transforme numerele din ex. dintr-o baza in cealalta
Conventii lexicale
A. Constante intregi →succesiune de cifre (fara punct zecimal)
- Modificarea tipului constantei intreaga corespunzator
domeniului de variatie se poate face folosind sufixurile:
- u sau U constantele devin unsigned (fara semn)
- l sau L sunt de tip long (dubla precizie)
Ex.: 123u, 32L, 432734l, 1234ul
Tipul implicit = constanta intrega cu semn, scris in baza 10,
corespunzand modul de scriere: fără prefix, (cu 0 sau 0x în faţă)
si fara sufix (u, U, l, L scris la sfarsit) al constantei.
Conventii lexicale
B. Constante reale (in virgula mobila) → alcatuite dintr-o parte
întreaga,punctul zecimal, o parte fractionara si optional, un
exponent întreg cu semn precedat de caracterul e sau E. Poate lipsi
partea întreaga sau partea fractionara, dar nu amândoua.
[±]ParteIntreaga.ParteFractionala𝑒𝐸
± 𝐸𝑥𝑝𝑜𝑛𝑒𝑛𝑡𝑓𝑙
//𝐹𝐿
Obs.: Implicit (fara specificator de tip) constantele reale sunt de tip double.
Specificatorii de tip: f/F pentru float
l/L pentru long double
Ex.: 1245.7
-34.9e-2f
Conventii lexicale
C. Constante caracter → unul sau mai multe caractere cuprinse întreghilimele simple (apostrof).
Ex.: ‘a’ ‘\n’ ‘\27’
Obs.: constanta de un singur caracter este de tipul char
constanta multi-caracter este de tipul int
Caracterele simple sunt memorate prin intermediul codului ASCII, reprezentand o valoare intreaga pe un octet
Ex.: '1' = 49
'a' = 97
'A' = 65
Conventii lexicale
C. Constante caracter
Constanta multi-caracter (caractere speciale, caractere de control, secvente de escape):
- caractere speciale: ‘\n’ = new line
‘\t’ = tab
‘\a’ = sunet
‘\\’ = caracterul \
‘\’’ = caracterul ‘
‘\”’ = caracterul ”
- caractere de control, specificate prin cod ASCII:
‘\nn’ = caracter cu cod ASCII in format zecimal
‘\0nnn’= caracter cu cod ASCII in format octal
‘\xnn’= caracter cu cod ASCII in format hexazecimal
Ex.: pentru ESC ‘\27’ ‘\033’ ‘\x1b’
pentru CTRL/C ‘\03’
Conventii lexicale
D. Constante sir de caracter → secventa de caractere cuprinsa întreghilimele (duble), este de tipul vector de caractere si la sfarsit are adaugat caracterul terminator de sir ‘\0’
Are clasa de memorare static
Poate contine caractere speciale
Ex.: “Sir de caractere \n”
Obs.: Unui pointer catre un sir de caractere care se initializeaza cu o constanta sir de caractere NU i se aloca memorie
char *nume;
- - - - - - - - - - -
nume=“Ionescu”;// Corect, fara alocare
E. Constante booleane → cuvintele cheie: true,false
Conventii lexicale
4. Operatori (operators) → simboluri care semnifica operatii
se vor studia mai tarziu
5. Semnele de punctuatie (punctuators) → caractere (tokens) a caror
semnificatie sintactica si semantica se stabileste in functie de
context (relativ la alte categorii lexicale ce le insotesc).
→ unele, singure sau in combinatie au semnificatie proprie
(formeaza operatori);
→ unele sunt folosite in sintaxa de preprocesare (Ex.: #)
! % ^ & * ( ) – + = { } | ~ [ ] \ ; ' : " < > ? , . / #
Obs.: Caracterele ( ),[ ],{ } trebuie se folosesc numai in pereche
Separatori (separators) → in C++ sunt 9 separatori, formand o
submultime a semnelor de punctuatie: ( )[ ]{ }, ; :
Variabila. Obiect
Variabila / Obiect → regiune (zona)de memorie in care este stocata o
informatie binara.
→ are asociat un tip de date, care stabileste:
- dimesiunea spatiului de memorie alocat.
- semnificatia informatiei stocate
→ are asociat un nume, prin care variabila este identificata in
spatiul aplicatiei:
→ are o durata de viata (lifetime) si un domeniu de existenta
Obiect → variabila care are ca tip de date o clasa.
Declaratii. Definitii.
Declaratie → instructiune prin care se anunta existenta unui nume. NU
stabileste alcatuirea entitatii numelui, motiv pentru care nu se
aloca spatiu de memorie.
Sintaxa declaratie variabila:
tip_data nume;
Obs.: Declaratia nu se refera numai la variabile, ci si la alte entitati
precum, tipuri de date, functii, etc.
Ex.: int a; // declaratie si defintie
int fct(int); // nu este necesara declararea numelui
parametrului
struct s; // declaratie tip date
class t; // declaratie tip date
s var1; // declaratie variabila cu numele var1 avand
tipul de date s
t var2; // declaratie variabila cu numele var2 avand
tipul de date t
Declaratii. Definitii.
Definitie → instructiune prin care se stabileste continutul (alcatuirea)
entitatii la care se refera un nume.
→ stabileste dimensiunea memoriei alocate numelui
Ex.: int fct(int a) // ESTE necesara declararea numelui parametrului
{ return a+1;
};
struct s // definitie tip date; stabileste alcatuirea lui
{ int s;
float a;
};
Obs.: - Sunt situatii in care o declaratie este si o definitie a numelui
Ex.: int a;
- Orice definitie este si o declaratie a numelui respectiv.
Declaratii. Definitii.
Intr-un program (in intregul proiect) trebuie sa existe o singura
definitie a unui obiect, insa pot exista oricate declaratii.
Ex.: struct s;
- - - - - - - - - - -
struct s; // corect, redeclarare
int a;
- - - - - - - - - - - -
int a; // incorect, eroare, variabila redefinita
Domeniu de definitie (scope)
→ zona din program in care un nume este cunoscut si poate fi folosit
• Domeniul local → numele este declarat intr-un bloc (secventa de instructiuni cuprinsa intre {}). Numele poate fi folosit incepand cu locul declararii pana la sfarsitul blocului
Ex.:
{ {
} }
• Domeniul functie → numele este declarat intr-o functie; echivalent cu domeniul local al blocului functiei
- - - - - - - - -
int a=1;
- - - - - -a++;
- - - - - - - - -
- - - - - - - - -
- - - - - - - - - - - -int b=1;
b++;
int a=2;
b=a+1;
- - - - - - - - - - - -
- - - - - - - - -
Domeniu de definitie (scope)
→ zona din program in care un nume este cunoscut si poate fi folosit
• Domeniul local → numele este declarat intr-un bloc (secventa de instructiuni cuprinsa intre {}). Numele poate fi folosit incepand cu locul declararii pana la sfarsitul blocului
Ex.:
{ {
} }
• Domeniul functie → numele este declarat intr-o functie; echivalent cu domeniul local al blocului functiei
- - - - - - - - -
int a=1;
- - - - - -a++;
- - - - - - - - -
- - - - - - - - -
- - - - - - - - - - - -int b=1;
b++;
int a=2;
b=a+1;
- - - - - - - - - - - -
- - - - - - - - -
Variabila a NU este definita,
NU poate fi folosita
Domeniu de definitie (scope)
→ zona din program in care un nume este cunoscut si poate fi folosit
• Domeniul local → numele este declarat intr-un bloc (secventa de instructiuni cuprinsa intre {}). Numele poate fi folosit incepand cu locul declararii pana la sfarsitul blocului
Ex.:
{ {
} }
• Domeniul functie → numele este declarat intr-o functie; echivalent cu domeniul local al blocului functiei
- - - - - - - - -
int a=1;
- - - - - -a++;
- - - - - - - - -
- - - - - - - - -
- - - - - - - - - - - -int b=1;
b++;
int a=2;
b=a+1;
- - - - - - - - - - - -
- - - - - - - - -
Variabila a NU este definita,
NU poate fi folosita
Domeniu de definitie pentru a
Domeniu de definitie
• Domeniul clasa → numele este asociat unui membru al clasei; se
foloseste in interiorul clasei.
• Domeniul fisier / global → numele este declarat in afara oricarui
bloc sau clasa;
→ are ca domeniu fisierul in care a fost declarat;
→ se poate folosi de la locul declaratiei pana la sfarsitul
fisierului;
→ NU se poate folosi in tot programul (restul fisierelor din
proiect). Pentru utilizare in alt fisier, trebuie declarat (in acel
fisier) ca extern
( Ex.: extern int a; )
Domeniu de vizibilitate
→ un nume este vizibil in intregul domeniu de definitie, cu exceptia
cazului in care numele este redefinit intr-un bloc inclus in
domeniul de definitie initial (domenii imbricate), caz in care
primul nume este partial ascuns.
Ex.: void fct()
{ int i=10;
{ int i=100;
cout << i << endl; // se afiseaza 100
}
cout << i << endl; // se afiseaza 10
}
Domeniu de vizibilitate
→ un nume cu domeniul de definitie fisier (global) poate fi accesat intr-
un domeniu local in care este ascuns prin redefinire folosind
operatorul de rezolutie ::
Ex.: int i=10;
void fct()
{ int i=100;
cout<<“val globala”<<::i<<endl; // se afiseaza 10
cout<<“val locala”<<i<<endl; // se afiseaza 100
}
→ redefinirea unui nume se poate face numai in domenii diferite, in caz
contrar se obtine eroare de redefinire
Durata de viata a variabilelor
(Domeniu de existenta)
O variabila este creata in momentul definirii si este distrusa cand se
paraseste domeniul de definitie.
O variabila globala se creaza in momentul definirii si exista pana la
terminarea programului
O variabila locala se creaza de fiecare data cand se executa intructiunea
de definire.
Obs.: Din acest motiv nu este indicat sa se defineasca variabile in
interiorul ciclurilor
Durata de viata a obiectelor
EXCEPTIE de la regulile anterioare (generale) o fac obiectele declarate
static:
→ ele isi incep existenta din momentul defintiei,
→ NU se distrug la terminarea blocului, exista pana la terminarea
programului.
→ Desi ele exista pana la terminarea aplicatiei, in intreg programul,
sunt vizibile numai in interiorul blocului in care au fost definite.
→ Se initializeaza automat (implicit) la definire cu 0
→ Instructiunea de definire (si initializare daca este explicita) se
executa numai o data, la prima parcurgere (cand se creaza obiectul).
Obs: In C++ si variabilele globale se impliciti cu 0
Durata de viata a obiectelor
Ex.: #include <iostream>
int a;
void fct()
{ int b=1;
static int c=2;
a++,b++,c++;
cout<<“a=”<<a<<“ b=”<<b<<“ c=”<<c<<endl;
}
int main()
{ for(int i=0;i<5;i++)
fct();
}
TEMA: ce afiseaza programul, cum se explica rezultatul?
Interesant este ca in acest punct al
programului:
a exista, e vizibil, e def.
b nu exista, nu e vizibil, nu e def.
c EXISTA, nu e vizibil, nu e def.
Categorii de memorare
auto → obiecte locale care se creaza (aloca memoria) automat la fiecare parcurgere a blocului. Este modul implicit de alocare a memorieiunui obiect, nu se fol. in practica.
register → pentru obiectele (variabile) folosite des se aloca memoriaintr-unul din registrii procesorului, pentru a avea timp de acces mic.Compilatoarele noi fac aceasta optimizare automat, nu se foloseste in practica.
extern → pentru obiecte globale (care se definesc intr-un singurfisier), pentru a le accesa din alte fisere trebuie declarate de tip extern.
static → obiect care exista permanent, de la definire pana la terminarea programului, este vizibil numai in interiorul functiei, bloculuisau fisierului in care a fost definit
Categorii de memorare
Variabila globala definita static
- se poate folosi numai in fisierul in care a fost definita
- NU poate fi declarata extern in alt fisier.
- Se blocheaza accesul din alt fisier la acest obiect.
Obiectele statice sunt obiecte globale (permanente) carora li se
restrange domeniul de vizibilitate la nivelul blocului, functiei sau
fisierului in care au fost definite
Tipuri de date
O variabila (numele asociat ei) are un tip de date asociat, care
determina:
- dimensiunea memoriei alocate numelui,
- domeniul de variatie,
- “decodarea” informatiei binare stocate,
- operatiile care se pot aplica variabilei.
Denumirea unui tip de date se numeste nume de tip (in particular, cand
utilizatorul defineste un nou tip de date, ii asociaza un nume nou)
Operatiile care se pot aplica unui tip de date sunt:
sizeof
new
Tipuri de date
Tipuri de date fundamentale (de baza)
• Tipuri intregi: char 1 oct.
int 2 oct. (4 oct.)
• Tipuri reale (in virgula mobila):
float 4 oct.
double 8 oct.
Modificatori de tip, folositi pentru ajustarea dimensiunii spatiului de
memorare, domeniului de variatie, preciziei:
signed (implicit), numai pentru tipuri intregi
unsigned numai pentru tipuri intregi
short
long
Tipuri de date
Tipuri de date fundamentale (de baza)
char 1 oct. -128 … 127
short int 2 oct. -32768 … 32767
int 2 oct. (4 oct.)
long int 4 oct. -2147483648 … 2147483647
long long int 8 oct.
unsigned char 1 oct. 0 … 255
unsigned int 2 oct. 0 … 65535
unsigned long 4 oct. 0 … 4294967295
float 4 oct. +/-(3.4E-38 ... 3.4E38) prec. 7 cifre
double 8 oct. +/-(1.7E-308 ... 1.7E308) prec. 15 cifre
long double 10 oct. +/-(3.4E-4932 ... 1.1E4932) p. 19 cifre
Obs.: dimensiunea alocata fiecarui tip de date fundamental depinde de
compilator, sistem de operare, etc. Este bine sa se verifice dimensiunile
tipurilor inainte de folosirea lor: ex.: sizeof(int)
Tipuri de date
Tipuri de date fundamentale (de baza)
Obs.:
Tipul long float este corect (sintactic), insa este echivalent
cu double
La scrierea tipurile intregi modificate , se poate omite tipul de
baza
Ex.:
long este echivalent cu long int
long long este echivalent cu long long int
Reprezentarea numerelor intregi negative se fac in complement fata de 2
Tipuri de date
Tipuri de date fundamentale (de baza)
•Tipul void folosit pt. pointeri, valoare returnata de functii
•Tipul bool tip date logice, valori de adevar: true, false
Se pastreaza regula (din C) de evaluare a expresiilor (valorilor)
logice:
orice valoare diferita de zero este true
numai zero are valoare logica false
Tipuri de date
Tipuri de date fundamentale (de baza)
Atunci cand se intalnesc variabile cu tipuri de date diferite, compilatorul
realizeaza o operatie de conversie (cast) automata a tipului
In general, regula de baza este ca tipul de date mai simplu este promovat
catre cel mai complex:
Ex.: char → int int → long int
int → float float → double
Ex.: (explicatie mecanism de conversie)
int main() int main()
{ int a=5,b=2; { int a=5;
double c; double b=2.0, c;
c = a/b; c = a/b;
cout<<c<<endl; cout<<c<<endl;
} }
Tipuri de dateTipuri de date fundamentale (de baza)
Constante
Cuvantul cheie const blocheaza posibilitatea de modificare a
unei variabile, aceasta devenind o variabila cu valoare constanta
Ex.: const int a2 = 54;
ATENTIE! Acest tip de constanta este o variabila, deci i se aloca
memorie, iar valoare este stocata in acea memorie.
Constanta simbolica
Se poate defini o constanta prin directiva de preprocesare:
#define nume valoare
Ex.: #define a2 54
ATENTIE! Acest tip de constanta NU ocupa loc in memorie, in esenta
este o prelucrare la nivel de text, in etapa de precompilare
! Fara ;
Tipuri de date
Constanta simbolica
Atentie ! Inlocuirea la nivel de text se face in tot textul codului sursa
Se pot obtin alterari la nivel de nume, cuvinte cheie, etc.
Ex.: #define a2 54
#define or 39
. . . . . . . . .
a2 = 10;
for(i=0;i<10;i++)
. . . . . . . . .
Operatori
Unul dintre scopurile realizării programelor
este de a face calcule = operații
(Instrucțiunea de tip) expresia = înșiruire de operanzi și operatori
Operanzii = entitățile asupra cărora se execută operațiile, pot fi:
constante,
constante simbolice,
variabile,
nume de funcții (apel de funcție)
Operatorii = simboluri ce determină modul de prelucrare al operanzilor
Evaluarea expresiilor se face în conformitate cu:
ordinea de priorități,
modul de asociere,
regulile de evaluare.
Operatori. Operanzi.
Clasificare
în raport cu numărul de operanzi asupra cărora se aplică:
• operatori unari, care se aplica unui singur operand
• operatori binari, care se aplica pentru doi operanzi
• operanzi ternari, care se aplică între trei operanzi
Operatori. Clasificare.
Modul de asocierea a operatorilor
Asocierea operatorilor = ordinea în care este efectuată prelucrarea
operanzilor în evaluarea expresiei.
Toți operatorii se asociază de la stânga la dreapta
cu excepția: operatorilor unari,
operatorului condițional
operatorilor de atribuire
care se asociază de la dreapta la stânga.
Operatori. Modul de asociere.
Ordine de priorități a operatorilor
= ordine implicită a executării operațiilor în evaluarea unei expresii
compuse, care conține mai mulți operatori,
se poate modifica prin utilizare parantezele rotunde: ( , ) .
Operatori. Ordinea de priorități.
Operatori aritmetici
Operator de schimbare a semnului (minus)
Sintaxa: a = -b;
Proprietăți:
- operator unar
- evaluare dreapta-stânga = se aplică operandului din dreapta
Exemplu: int main()
{ int a, b = 5;
a = -b;
cout << a << endl;
}
Operatori. Operatori de aritmetici.
Operatori aritmetici. Operatori aditivi
Operatorul de adunare + Sintaxa: a = b + c;
Operatorul de scădere - Sintaxa: a = b - c;
Proprietăți:
- operator binar
- evaluare stânga-dreapta
Exemplu: int main()
{ int a, b = 15, c = 8, d;
a = b + c;
d = b – c;
cout << a << “ ” << d << endl;
}
Operatori. Operatori de aritmetici.
Operatori aritmetici. Operatori multiplicativi
Operatorul de înmulțire * Sintaxa: a = b * c;
Operatorul de împărțire / Sintaxa: a = b / c;
Operatorul de împărțire modulo % Sintaxa: a = b % c;
( = restul împărțirii lui b la c)
Proprietăți:
- operator binar
- evaluare stânga-dreapta
Exemplu: int main()
{ float a, b = 15, c = 8, d, e;
a = b * c;
d = b / c;
e = b % c;
cout << a << “ ” << d << “ ” << e << endl;
}
Operatori. Operatori de aritmetici.
Operatori aritmetici. Operatori multiplicativi
Temă: Se citesc două numere de la tastatură. Să se determine dacă
primul este divizor al celui de-al doilea
Determinați daca un număr citit de la tastatură este număr par
(impar).
Operatori. Operatori de aritmetici.
Operatori logici de modificare la nivel de bit (bitwise)
Sunt operatori care se aplică datelor de tip întreg
Le modifică valorile la nivel de bit (în reprezentarea lor binară)
Exemplu: valoarea întreaga 15, prelucrările se fac în binar 1111
Operatori. Operatori logici de modificare la nivel de bit (bitwise)
Complement față de 1 (inversarea valorii logice) ~
Sintaxa: a = ~b;
Proprietăți:
- operator unar
- evaluare dreapta-stânga = se aplică operandului din dreapta
Exemplu:
char a=7; în binar a= 00000111
b=~a; rezultă b= 11111000
se obţine: b=248
Operatori. Operatori logici de modificare la nivel de bit (bitwise)
b a = ~b;
0 1
1 0
ŞI (AND) &
Sintaxa: a = b & c;
Proprietăți:
- operator binar
- evaluare stânga-dreapta
Exemplu:
char b=12,c=5,a; în binar b = 00001100
c = 00000101
a = b & c; rezultă a = 00000100
se obţine: a = 4
Operatori. Operatori logici de modificare la nivel de bit (bitwise)
b c a=b&c;
0 0 0
0 1 0
1 0 0
1 1 1
SAU (OR) |
Sintaxa: a = b | c;
Proprietăți:
- operator binar
- evaluare stânga-dreapta
Exemplu:
char b=24,c=10,a; în binar b = 00011000
c = 00001010
a = b | c; rezultă a = 00011010
se obţine: a = 28
Operatori. Operatori logici de modificare la nivel de bit (bitwise)
b c a=b|c;
0 0 0
0 1 1
1 0 1
1 1 1
SAU EXCLUSIV (XOR) ^
= adunare modulo 2
Sintaxa: a = b ^ c;
Proprietăți:
- operator binar
- evaluare stânga-dreapta
Exemplu:
char b=48,c=20,a; în binar b = 00110000
c = 00010100
a = b ^ c; rezultă a = 00100100
se obţine: a = 36
Operatori. Operatori logici de modificare la nivel de bit (bitwise)
b c a=b^c;
0 0 0
0 1 1
1 0 1
1 1 0
Operatori de deplasare (shift)
se aplică datelor de tip întreg
acționează asupra reprezentării lor binare.
realizează deplasarea biţilor unui număr b cu un număr de c poziții
întruna din direcții (stânga sau dreapta)
Operatorul de deplasare dreapta-stânga <<
Sintaxa: a = b << c;
Operatorul de deplasare dreapta-stânga >>
Sintaxa: a = b >> c;
Proprietăți: - operator binar
- evaluare stânga-dreapta
Operatori. Operatori logici de modificare la nivel de bit (bitwise)
Operatori de deplasare (shift)
Exemplu:
char b=10,c=2,a; în binar b = 00001010
a = b << c; rezultă a = 00101000
se obţine: a = 40
Exemplu:
char d=210,e=3,g; în binar d = 11010010
g = d >> e; rezultă g = 00011010
se obţine: g = 26
Operatori. Operatori logici de modificare la nivel de bit (bitwise)
Operatori de deplasare (shift)
Observație:
Prin deplasare:
informația care se află în capăt, în sensul de deplasare, se pierde,
poziția din coadă, eliberată, se completează cu zero.
Exemplu:
char d=211,e=1,g; în binar d = 11010011
g = d << e; rezultă g = 10100110
Exemplu:
char d=211,e=1,g; în binar d = 11010011
g = d >> e; rezultă g = 01101001
Operatori. Operatori logici de modificare la nivel de bit (bitwise)
Operatori de deplasare (shift)
Observație: Cele mai rapide operații aritmetice
Prin deplasare de k ori la stânga, daca nu se pierd biți la capăt, se
obține înmulțirea valorii cu 2k
Exemplu:
char a=3, c;
c = a << 4; // se obține c = 3x24 = 3x16 = 48
Prin deplasare de k ori la dreapta se obține împărțirea valorii cu 2k
(prin aproximare pe întregi)
Exemplu:
char a=23, c;
c = a >> 2; // se obține c = 23:22 = 23x4 = 5
Operatori. Operatori logici de modificare la nivel de bit (bitwise)
Operatori. Operatori de atribuire.
Operatori de atribuire
Operatorul simplu (standard) =
Sintaxa: nume_variabilă = expresie ;
• Operator binar: operand_stang = operand_drept
• Se evalueaza de la dreapta la stanga: se evalueaza mai intai
opernadul drept care apoi este transferat in operandul drept
• In urma efectuarii operatiei de atribuire se intoarce (return) ca
raspuns rezultatul transferat din drepta in stanga. Din acest motiv se
poate realiza operatie de atribuire multipla
var_1 = var_2 = . . . = var_n = expresie ;
Ex.: a = b = c = 5; echivalent cu: c=5; b=c; a=b;
a1 = cv3 = asd + 5*sd;
Operatori. Operatori de atribuire.
Operatori de atribuire compusi op =
Sintaxa: nume_var op = expresie ;
Echivalent cu: nume_var = nume_var op expresie ;
în care op este unul dintre operatorii binari:
• multiplicativi: * , / , %
• aditivi: + , -
• de deplasare: >> , <<
• de modificare la nivel de bit: & , | , ^
Operatori. Operatori de atribuire.
Operatori de atribuire compusi op =
Operator Exemplu Echivalent Rezultat
*= a*=5 a=a*5 250
/= a/=10 5
%= a%=3 2
+= a+=13 63
-= a-=7 43
>>= a>>=3 6
<<= a<<=1 100
&= a&=15 2
|= a|=12 62
^= a^=5 55
Operatori. Operatori relationali
Operatori relationali
• Operatorii relaţionali sunt folosiţi pentru a determina relaţia de
ordonare între doua expresii.
• Rezultatul obţinut prin aplicarea acestor operatori este tip logic
(boolean): adevărat (true) sau fals (false), conform regulii:
– valoarea 0 (zero) reprezintă valoarea logică fals
– orice valoare diferită de zero corespunde valorii logice
adevărat.
Operatori. Operatori relationali
Operatorii relaţionali: Sintaxa:
> mai mare expresie_1 > expresie_2
< mai mic expresie_1 < expresie_2
>= mai mare sau egal expresie_1 >= expresie_2
<= mai mic sau egal expresie_1 <= expresie_2
Exemplu:
(x+3)<5 dacă x=1 valoarea întoarsă este adevărat (true)
dacă x=4 valoarea întoarsă este fals (false)
Tema:
Sa se evalueze: x + 3 < 5
Operatori. Operatori de egalitate
Operatoratori de egalitate (logica)
• Sunt folosiţi pentru a determina daca doua expresii au rezultat egal
sau diferit.
• Rezultatul obţinut prin aplicarea acestor operatori este tip logic
(boolean): adevărat (true) sau fals (false).
Operatorii de egalitate: Sintaxa:
= = egalitate expresie_1 = = expresie_2
!= diferit expresie_1 != expresie_2
Ex.: (x%3)==2 dacă x=5 rezultatul este adevărat (true)
dacă x=1 rezultatul este fals (false)
Operatori. Operatori logici
Operatoratori logici
• Operatori pentru prelucrarea valorilor (operanzi, expresii) logice.
• Rezultatul obţinut este de tip logic (boolean): adevărat (true) sau
fals (false).
Operator logic unar: evaluare dreapta-stânga, adică se aplică
operandului din dreapta:
! negare (inversarea valorii logice) !expresie
Exemplu:
int a=5, b=7;
bool t = !(a<7);
Operatori. Operatori logici
Operatori logici binari, evaluare stânga-dreapta
|| SAU expresie_1 || expresie_2
Exemplu: ((x+5)<3)||(x>3)
dacă x=3 răspunsul este fals (false)
dacă x=5 răspunsul este adevărat (true)
dacă x=-4 răspunsul este adevărat (true)
Tema:
int a=5,b=7;
boole t;
t = ((a+=7)&3)||(b==8);
cout << a << b << t << endl;
Operatori. Operatori logici
Operatori logici binari, evaluare stânga-dreapta
&& SI expresie_1 && expresie_2
Exemplu: ((x+5)<3)&&(x<3)
dacă x=3 răspunsul este fals (false)
dacă x=-3 răspunsul este adevărat (true)
dacă x=-4 răspunsul este adevărat (true)
Tema:
int a=5,b=7;
boole t;
t = ((a^=7)&3)&&(!(b+8))||(a=9);
cout << a << b << t << endl;
Operatori. Operatori logici
Operatori logici binari
Operatorii logici binari: && şi ||, NU realizează evaluarea tuturor
expresiilor (operanzilor) asupra cărora acţionează,
ci evaluază operanzii în ordine apariţiei, de la stanga la dreapta, până
când se întâlneşte primul rezultat care determină rezultatul final,
expresiile care urmează NU mai sunt evaluate.
Mai exact:
• pentru && evaluarea se face până la prima expresie care are
valoare fals => răspunsul final fiind automat fals.
• pentru || evaluarea se face până la primul rezultat adevarat,
=> rezultatul final luând valoarea adevarat.
Operatori. Operatori logici
Operatori logici binari
Exemplu:
int a,b,c;
a=b=10;
c=(a=0)&&(b=1)&&(a=2);
cout<<a<<b<<c<<endl;
Operatori. Operatori de incrementare/decrementare
Operatori de incrementare/decrementare
Operatori unari, pot fi prefixati si postfixati (sufixati)
++ incrementare a++ sau ++a rezultatul final a = a+1
-- decrementare a-- sau --a rezultatul final a = a-1
Operatori. Operatori de incrementare/decrementare
Operatori de incrementare/decrementare
Mod de prelucrare
operaţie postfixata (sufixate):
• valoarea operandului este mai întâi folosită în prelucrare (cu
valoarea curenta),
• iar apoi este incrementată / decrementată.
Exemplu:
int a=10,x;
x=a++; /* echivalent cu:
x=a;
a=a+1; */
cout<<a<<x<<endl;
Operatori. Operatori de incrementare/decrementare
Operatori de incrementare/decrementare
Mod de prelucrare
operaţie prefixata:
• valoarea operandului este mai întâi incrementată / decrementată,
• iar apoi este folosită în prelucrare (cu noua valoarea).
Exemplu:
int a=10,x;
x=--a; /* echivalent cu:
a=a-1;
x=a; */
cout<<a<<x<<endl;
Operatori. Operatori de incrementare/decrementare
Operatori de incrementare/decrementare
Tema 1:
int a=10;
cout<<a++<<endl;
cout<<++a<<endl;
Tema 2:
int x,a=10;
x= ++a--;
cout<<a<<endl<<x<<end;
Operatori. Operatorul conditional
Operatorul conditional ?:
Operator ternar, evaluare stanga-dreapta
Sintaxa:
expresie_condiţie ? expresie_1 : expresie_2;
Echivalent:
dacă expresie_condiţie este adevărată
atunci
execută expresia_1
altfel
execută expresia_2
Operatori. Operatorul conditional
Operatorul conditional ?:
Exemplu:
float a=123.56, b=-12.6;
cout<<”Modulul numarului ”<<a<<” = ”<< a>0?a:-a;
cout<<”Modulul numarului ”<<b<<” = ”<< b>0?b:-b;
Operatori. Operatorul virgula
Operatorul virgula ,
Se foloseste la concatenarea a doua (sau mai multe) instructiuni, in
general acolo unde sintaxa ne obliga sa folosim numai una singura.
Exemplu: Introducerea mai multor experesii in interiorul operatorului
conditional ?:
Sintaxa:
expresie_conditie ? expresie1[, expresie2]:expresie4[, expresie5]
int a=5, b;
b = a>0?a,a++:-a,a--;
Operatori. Operatorul sizeof
Operatorul sizeof
Se foloseste pentru determinarea dimensiunii unei date sau tip de data
Sintaxa:
sizeof(nume_variabila)
sizeof(nume_tip_data)
Exemplu:
int a=5;
cout<<”Dim. var. a este:” << sizeof(a) << endl;
cout <<”Dim. float:” << sizeof(float) << endl;
Operatori. Operatorul cast
Operatorul cast
Se foloseste pentru converisa fortata (explicita) a tipului de date
corespunzator unei variabile
Sintaxa:
(nume_tip_data)nume_variabila
Exemplu:
int a=5, b=2;
float c;
c = (float)a/b;
Tema: Ce afiseaza blocul de instuctiuni?
float a=5.5,b=2.0,c;
c = (int)a/b;
cout << c << endl;
Operatori. Reguli de conversie implicita
Reguli de conversie implicita.
A. Conversia de tip in evaluarea expresiilor
Cand o expresie conţine operanzi de tipuri diferite, se realizeaza o
operatie de cast (morificare de tip) automata (implicita), care are
ca scop aducerea operanzilor la acelasi tip.
Regula generală de conversie a tipului în evaluarea expresiilor:
tipurile mai mici (simple) sunt promovate către cele mai largi
(complexe), care dictează şi tipul rezultatul operaţiei
Observatie: In general, tipul char este transformat automat la
evaluare în tipul int. Sunt compilatoare la care si datele de tip
float sunt convertite în double
Operatori. Reguli de conversie implicita
Reguli de conversie implicita.
A. Conversia de tip in evaluarea expresiilor
Ordinea de conversie: long double
double
float
unsigned long long
long long
unsigned long
long
unsigned int
int
Tema: Ce afiseaza blocul de instructiuni?
unsigned int a=210;
int b=-120;
int c;
c=a+b;
cout<<c<<endl;
Dim
ensi
un
e
Sen
sul
de
pro
mo
va
re
Operatori. Reguli de conversie implicita
Reguli de conversie implicita.
B. Conversia de tip in operatii de atribuire
În operaţiile de atribuire în care tipul operandului stânga diferă de cel
obţinut prin evaluarea expresiei membru-dreapt se face o conversie
automată a tipului din dreapta în tipul variabilei din stânga.
Dacă tipul din stânga este mai larg decât cel din dreapta, atunci în
procesul de atribuire NU se obţin erori.
În caz contrar, se obţine o pierdere de informaţie (trunchiere).