4. Operatori şi Expresii

  • Uploaded by: gabyroot18
  • 0
  • 0
  • June 2020
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View 4. Operatori şi Expresii as PDF for free.

More details

  • Words: 1,241
  • Pages: 26
4. Operatori şi expresii

EXPRESII CONCEPTE TEORETICE • Expresiile: construcţii formate din operanzi şi operatori. • Evaluarea produce ca rezultat o valoare de un anumit tip. • Evaluarea expresiilor se face după anumite reguli, incluse în limbaj (IMPORTANT: ordinea de evaluare, care poate fi impusă prin paranteze). Programatorul trebuie să aibă răbdarea de a evalua pe subexpresii, precizând pentru fiecare tipul.

• Operanzii pot fi: – Constante (literali, simbolice, obiect) – Variabile (simple, indexate, calificate) – Referiri de funcţii – Expresii (construcţie recursivă) (limbajele pot avea particularităţi; ex.: tip dată, nume masiv) • Exemple de expresii: 23, a*b+x[i], risc2, val-bd(f,g) • Relaţia expresie-instrucţiune: expresie; Ex. ► trei instrucţiuni: a; r+t: stocf1=stoci+intr-ies;

Operatori • •

Operatorii pot fi unari sau binari. Ei au priorităţi de evaluare. În limbajul C sunt definite următoarele tipuri de operatori (sunt şi alţii particulari): a) b) c) d) e) f) g)

atribuire; aritmetici; logici şi relaţionali; la nivel de bit; operatori de atribuire combinaţi; operatorul “,” operatorul “?:” (este operator ternal)

a) Operatorul de atribuire “=“ Spre deosebire de alte limbaje (de exemplu Pascal) în care atribuirea este executată de o instrucţiune, în C aceasta se realizează prin intermediul unei expresii cu operatorul de atribuire “=“, de forma:

identificator_variabila = expresie

Efectele atribuirii constau în: • Evaluarea expresiei din dreapta; • Memorarea valorii calculate (cu conversie) în variabila identificator_variabila; • Ataşarea valorii variabilei identificator_variabila întregii expresii. Exemplu: int v; Efectul funcţiei printf(“%d”, v = 123); este afişarea valorii expresiei v = 123, adică 123.

În cazul operaţiei de atribuire multiplă, de forma: id1=id2=…=idn=expresie Expresia se evaluează de la dreapta la stânga. ! ATENŢIE LA CONVERSII ! Exemplu: • a=b=c=10.4 are ca efect atribuirea valorii 10.4 variabilelor a, b şi c ? ► Depinde de tipul variabilelor. • Afirmaţia: cum fiecare expresie de tip atribuire are valoarea variabilei înscrise, efectul este echivalent cu cel al secvenţei: id1=expr; id2=expr;…; idn=expresie ESTE CORECTĂ ?

ATENŢIE ! Într-o expresie de atribuire cu operanzi de tipuri numerice diferite, se face conversia valorii calculate la tipul variabilei receptoare Conversiile sunt utile în multe situaţii, dar în unele cazuri pot conduce la pierderi de informaţie.

Tip destinaţie

Tip expresie

Pierderi de informaţie dacă valoarea este mai mare decât 127, destinaţia va fi un întreg negativ, rezultat imprevizibil

signed char

unsigned char

unsigned char

int

octetul cel mai semnificativ, rezultat imprevizibil

unsigned char

long int

cei mai semnificativi trei octeţi, rezultat imprevizibil

short

long int

cei mai semnificativi doi octeţi, rezultat imprevizibil

int

float

trunchiere la întreg

float

double

se reduce precizia (cu rotunjire)

double

long double

se reduce precizia (cu rotunjire)

b) Operatori aritmetici b1) Operatori binari Semnificaţie operaţie

Simbol în C

Simbol în Pascal

Adunare

+

+

Scădere

-

-

Înmulţire

*

*

Împărţire

/

/

Împărţire întreagă (cît) – operanzi întregi

/

DIV

Împărţire întreagă (rest) – operanzi întregi

%

MOD

b2) Operatori unari Operatori unari

Simbol în C

Simbol în Pascal

Minus

-

-

Plus

+

+

Decrementare

--

Nu există

Incrementare

++

Nu există

sizeof

Nu există (este funcţie)

Dimensiunea in octeti

Operatorii “++” şi “--” admit operanzi de orice tip scalar, efectul obţinut fiind în funcţie de poziţia lor faţă de variabilă, astfel: • ++var sau --var: variabila var este modificată înainte de utilizarea ei în evaluarea expresiei curente (preincrementare/predecrementare); • var++ sau var--: variabila var este modificată după evaluarea expresiei (postincrementare/postdecrementare).

Exemplu y = x++ este echivalent cu secvenţa y = x; x = x+1; y = --x este echivalent cu secvenţa x = x-1; y=x;

c) Operatori logici şi relaţionali c1) Operatori logici Operatori logici

Simbol în C

Simbol în Pascal

Şi

&&

AND

Sau

||

OR

Nu există !

XOR

Sau exclusiv Negare

NOT

În limbajul C nu există tipul boolean (true/false). Operatorii logici admit operanzi de orice tip scalar, interpretaţi numeric, conform convenţiei: • adevărat ≠ 0; • fals = 0.

Rezultatul unei operaţii logice este de tip int, conform convenţiei: • adevărat = 1; • fals = 0.

C aplică principiul evaluării parţiale.

c1) Operatori relaţionali >, >=, <, <=, == (egalitate), != (neegalitate). Rezultatul unei expresii relaţionale este de tip int şi respectă aceeaşi convenţie ca cel al unei operaţii logice. Exemplu Expresia a<0 || b<0 are valoarea 1 dacă cel puţin unul dintre cele două numere a şi b este negativ, respectiv valoarea 0 în caz contrar.

d) Operatori la nivel de bit Operatori la nivel de bit

Simbol în C

Simbol în Pascal

Şi

&

AND

Sau

|

OR

Sau exclusiv

^

XOR

Negare

~

NOT

Deplasare la dreapta

>>

SHR

Deplasare la stânga

<<

SHL

Operanzii pot fi de orice tip întreg. Pentru o pereche de biţi x, y valorile posibile rezultate în urma aplicării operatorilor la nivel de bit sunt: x

y

x&y

x|y

x^y

~x

0

0

0

0

0

1

0

1

0

1

1

1

1

0

0

1

1

0

1

1

1

1

0

0

Operaţiile de deplasare au sintaxa: valoare << număr_poziţii valoare >> număr_poziţii Operanzii sunt de tip întreg, iar număr_poziţii indică numărul de poziţii de bit cu care se deplasează valoarea. La deplasarea, într-un sens sau altul, se propagă 0. Exemplu 21<<1 are valoarea 42: 00010101<<1 = 00101010 21>>2 are valoarea 5: 00010101>>2 = 00000101

Dacă tipul primului operand este întreg unsigned, deplasarea spre stânga este echivalentă cu valoare*2număr_poziţii, iar deplasarea spre dreapta este echivalentă cu valoarea:

 valoare   2 numar _ pozitii 

e) Operatori de atribuire combinaţi Operatorul de atribuire poate fi combinat cu o serie de operatori aritmetici şi la nivel de bit, rezultând expresii prescurtate. Această facilitate este specifică limbajului C (nu este implementată în limbajul Pascal). Dacă op este un operator dintre cei menţionaţi, expresiei var = var op expresie îi corespunde varianta var op = expresie.

Combinaţiile posibile sunt: +=, - =, *=, /=, %=, &=, |=, ^=, <<=, >>=.

f) Operatorul “,” Operatorul “,” este, de asemenea, specific limbajului C, nefiind implementat în Pascal. Pe lângă rolul de separator într-o listă, virgula este considerată şi operator, într-o secvenţă de forma: expresie_1, expresie_2, ..., expresie_n; Operatorul “,” induce evaluarea succesivă, de la stânga la dreapta, a expresiilor, întreaga secvenţă fiind tratată ca o expresie căreia i se atribuie în final valoarea corespunzătoare expresie_n.

Exemplu: int a=10, b=3, c, d; d=(c=a+b, b+=c, a/2); Valorile variabilelor după evaluarea expresiei de mai sus sunt: a=10, c=13, b=16, d=5.

g) Alţi operatori • Operatori de conversie explicită: (tip) operand • Operatorul paranteză: (exp_1, exp_2, ..., exp_n) • Operatorul condiţional (?:): expresie_1?expresie2:expresie_3 Exemplu: x=(a>b)?a:b;

Evaluarea expresiilor Expresiile sunt evaluate pe baza următorului set de reguli: • Precedenţa: determină ordinea de efectuare a operaţiilor într-o expresie în care intervin mai mulţi operatori; • Asociativitatea: indică ordinea de efectuare a operaţiilor în cazul unui set de operatori cu aceeaşi precedenţă;

• Regulile de conversie de tip: asigură stabilirea unui tip comun pentru ambii operanzi, pentru fiecare operaţie care solicită acest lucru şi în care tipurile diferă.

Tabelul asociativităţii şi precedenţei operatorilor: Operatori

Asociativitate

Prioritate

()

de la stânga la dreapta

maxim

+ - (unari) ++ -- (tip) sizeof ! ~

de la dreapta la stânga

* / %

+ - (binari) << >> < <= > >= ==

!=

de la stânga la dreapta

& (binar) ^ | && ||

?: = <<= ,

>>= += - = *= /= %= &= ^= |=

de la dreapta la stânga de la stânga la dreapta

minimă

ANOMALIE PASCAL a

Related Documents


More Documents from "cathy_mary"