Documente online.
Zona de administrare documente. Fisierele tale
Am uitat parola x Creaza cont nou
 HomeExploreaza
upload
Upload




Expresii si operatori

c


Expresii si operatori

Expresiile descriu simbolic operatii asupra unor elemente ale

limbajului (variabile , constante ).

Opreatiile asupra datelor se executa prin intermediul operatorilor.

Operatorii se caracterizeaza prin urmatoarele atribute:



n   numar de operanzi ( paritate)

n   tip

n   efect

Tipul se refera la domeniul de definitie al operatiei.

De exemplu , operatorul aritmetic (*) - inmultire este un operator binar si are efect asupra operanzilor reali sau intregi iar rezultatul va fi real sau intreg in functie de tipul operanzilor respectand regulile de conversie explicate anterior.

In functie de tipul lor operatorii limbajului C se pot clasifica īn:

a) operatori aritmetici:

n   binari;

n   unari.

b) operatori relationali si logici:

n   binari ;

n   unari.

c) operatori de egalitate

d) operatori logici pe biti:

n   binari;

n   unari.

e) operatori de atribuire;

f) operatorul conditional;

g) operatori de incrementare si decrementare;

h) operatorul virgula;

Cu ajutorul operatorilor enumerati mai sus se pot construi expresii.

In majoritatea cazurilor operatorii apar intre operanzi (operatorii binari) si inaintea operanzilor (operatori unari).

O expresie aritmetica corecta se formeaza dupa urmatoarele reguli:

Daca "o" este operator atunci:

- orice referinta la o data ( variabila simpla, indexata , constanta , functie , structura ) este o expresie.

Daca "o" este operator binar atunci E1 o E2 este o expresie , unde E1 , E2 sunt expresii.

Daca "o" este operator unar atunci oE este o expresie unde E este expresie.

(E) este o expresie unde E este o expresie.

Unei expresii i se asociaza un tip si anume tipul rezultatului.

Pentru evitarea ambiguitatilor in evaluarea expresiilor operatorilor li se asociaza proprietati de asociativitate , precedenta (prioritate) , comutativitate.

Operatori aritmetici

Operatorii aritmetici sunt operatori obisnuiti de adunare , scadere , inmultire , impartire si modulo.

inmultire

expresie * expresie

aduanre

expresie + expresie

scadere

expresie - expresie

impartire

expresie / expresie

modulo (restul impartirii intregi)

expresie % expresie

Vom insista putin asupra operatorului % . El se aplica numai expresiilor de tip intreg si in urma operatiei va rezulta restul impartirii intregi a celor 2 expresii.

Restul are semnul deāmpartitului.

Operatori relationali si logici.

operatori relationali.

Operatori relationali ai limbajului C sunt:

< mai mic

>     mai mare

<= mai mic sau egal

>=     mai mare sau egal

Exemplul 2.7.2.1.1.

Exemple de expresii relationale

a < b;

a <= b;

c >= d;

Evaluarea unei expresii conditionale produce un rezultat 0 sau 1 . Daca expresia este adevarata atunci rezultatul este 1, iar daca expresia este falsa atunci valoarea expresiei va fi 0.

De aceea , in limbajul C, sunt posibile constructii neintalnite in alte limbaje.

Invers , daca expresia este diferita de 0 ea are valoarea logica adevarat si daca expresia este egala cu 0 ea are valoarea logica fals.

Exemplul 2.7.2.1.2.

main()

Deoarece operatorul + are o prioritate mai mare decat operatorii relationali evaluarea se face in felul urmator:

a) se aduna b cu c si rezulta 8

b) se evalueaza a < 8. Expresia este adevarata deci a < 8 va vaea rezultatul 1;

c) se evalueaza apoi 1>=d, 1=1 care este o expresie adevarata.

In final se va scrie 1 deoarece 1=1 este o expresie aedvarata, iar z are valoarea1.

Tipul rezultatului evaluarii unei expresii relationale este int.

operatori logici

Operatorii logici sunt:

n   operatorul SI - && ( binar );

n   operatorul SAU - || ( binar );

n   operatorul negativ - ! ( unar ).

Operatorul SI (&&)

Fie z = expresie1 && expresie 2.

Evaluarea unei expresii in care , ca operanzi apar expresie 1, expresie 2 si operatorul && se evalueaza astfel :

a) se evalueaza expresia 1. Daca expresia 1 este adevarata

(diferita de 0) atunci se evalueaza expresia 2. Daca si aceasta este adevarata ( are valoare diferita de 0) atunci valoarea lui z va fi 1.

b) daca valoarea expresiei 1 este falsa atunci cealalta expresie

(expresia2 ) nu se mai evalueaza si rezultatul devine 0 (fals).

Rezultatul operatiei este de tip int.

Operanzii trebuie sa aiba unul din tipurile de baza.

Operatorul SAU ( || )

Fie z = expresie 1 || expresie 2.

Rezultatul (valoarea lui z) va fi 1 daca cel putin unul dintre operanzi va fi diferit de 0 si va fi 0 daca ambii operanzi sunt 0.

Al doilea operand nu se mai evalueaza daca primul operand este adevarat (diferit de 0);

Operanzii trebuie sa aiba un tip de baza sau poiter. Rezultatul este de tip int.

De exemplu , sa vedem cum se evalueaza expresia de mai jos:

if (a > b && c < d || a <= 7 )

Evaluarea expresiei in interiorul parantezei are loc astfel :

a) se evalueaza a > b;

b) se evalueaza c < d;

c) se evalueaza a <= 7;

d) se evalueaza a < b && c < d;

e) se evalueaza (a < b && c < d) || (a <= 7)

Operatorul && are o precedenta mai mare decat || ( este mai prioritar).

Operatorul !

Operatorul unar ! converteste un operand diferit de 0 (adevarat)

intr-un operand egal cu 0 (fals) si invers, un operand egal cu 0 (fals)

intr-un operand egal cu 1 (adevarat)

Un exemplu de utilizare a operandului unar ! este in instructiuni if.

if (! sfarsit) are sensul de if (sfarsit = = 0)

! sfarsit va avea valoarea 0 (fals) daca sfarsit e diferit de 0 si 1 (adevarat) daca sfarsit=0.

Operatorii de egalitate

Operatorii de egalitate sunt :

a) Operatorul egal : = =

b) Operatorul diferit : !=

Operatorii de egalitate au prioritatea mai mica decat a operatorilor relationali.

Operatorul egal (= =) testeaza egalitatea a doi operanzi.

Pentru egalitate valoarea expresiei X= =Y va avea valoarea 1 iar pentru cazul in care operanzii nu sunt egali expresia X= =Y va avea valoarea 0.

Operatorul diferit (!=) este negatul operatorului (= =) deci in caz de egalitate expresia X!=Y va avea valoarea 0 iar in cazul in care X si Y nu au aceleasi valori expresia va avea valoarea 1.

Exemplul 2.7.3.1.

x=5;y=3;

if(x= =y)

printf("valoarea expresiei x= =y este %d",x= =y);

Aceasta secventa de instructiuni va afisa ca rezultat valoarea 0 deoarece x este diferit de y.

Operatori logici pe biti

Operatorii logici pe biti sunt :

a) operatorul de deplasare;

b) operatorul SI pe biti;

c) operatorul SAU pe biti;

d) operatorul SAU exclusiv pe biti;

e) operatorul complement fata de 1;

Operatorii logici se pot aplica doar la tipul int (intreg);

Operatori de deplasare

Operatorii de deplasare fac deplasarea stanga sau dreapta cu numarul de pozitii de bit dat de operandul drept.

Operatorii de deplasare sunt de doua tipuri:

n   operator de deplasare stanga ;

n   operator de deplasare dreapta.

Sintaxa este urmatoarea :

expresie >> expresie (deplasarea dreapta a operandului din stanga cu un numar de pozitii dat de operandul din dreapta).

Expresie << expresie (deplasarea stanga a operandului din stanga cu un numar de pozitii dat de operandul din dreapta).

Deci x>>2 are semnificatia de deplasare dreapta a operandului x cu 2 pozitii.

Pentru deplasari dreapta , pozitiile devenite libere din stanga in urma deplasarii se completeaza cu bitul de semn.

Pentru deplasari stanga , pozitiile devenite libere se completeaza cu 0.

Daca expresia este de tip unsigned atunci in urma deplasarii dreapta pozitiile libere se completeaza cu 0.

Pentru un numar scris in baza 2 o deplasare stanga are efectul unei inmultiri cu 2 iar o deplasare dreapta are efectul unei impartiri intregi la 2.

Exemplul 2.7.4.1.1.

Fie intregul A0B7

In binar numarul are urmatoarea semnificatie :

1010 0000 1011 0111

A 0 B 7

Deplasam numarul cu 2 pozitii dreapta.

Numarul fiind negativ (primul bit , bitul 0 are valoarea 1) se va completa la stanga cu bitul de semn adica cu 1).

(dupa o deplasare dreapta)

D 0 5 B

1110 1000 0010 1101 (inca o deplasare la dreapta)

E 8 2 D

Deci numarul A0B7 decalat (deplasat ) dreapta cu 2 pozitii este E82D.

Daca dorim sa deplasam stanga cu doua pozitii obtinem:

0100 0001 0110 1110 (o deplasare stanga)

4 1 6 E

1000 0010 1101 1100 (inca o deplasare stanga)

8 2 D C

Programul care realizeaza aceste operatii este :

#include <stdio.h>

main()

La terminal se va scrie :

x deplasat cu 2 pozitii dreapta este E82D

x deplasat cu 2 pozitii stanga este 82DC

Operatrul SI pe biti

Tabela operatiei SI este :

SI

Simbolul operatiei SI este &

Sintaxa este urmatoarea :

expresie & expresie

Operatorul Si pe biti se foloseste pentru mascarea unor grupuri de biti.

Fie configuratia de biti:

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

B 7 5 8

Presupunem ca dorim sa facem zero valoarea bitilor 9 si 13.

Alegem constanta astfel incat in pozitiile 9 si 13 sa aiba 0 si in

rest 1.

1 0 1 1 0 1 1 1 0 1 0 1 1 0 0 0

1 0 0 1 0 1 0 1 0 1 0 1 1 0 0 0

Rezultatul care se obtine este 9558

Operatorul SAU pe biti

Simbolul operatiei SAU este |

Tabela operatiei SAU

SAU

Operatorul SAU se foloseste pentru a pozitiona anumiti biti pe 1.

Fie urmatoarea configuratie binara:

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

0 0 1 0 0 1 1 0 0 0 1 1 1 0 1 0

2 6 3 A

Dorim ca bitii 12 si 16 sa fie 1 si restul bitilor sa fie 0.

Constanta va fi:

0001 0000 0100 0000

1 0 4 0

x = x | masca

x initial = 263A

masca = 1040

x final = 367A

Operatorul SAU-EXCLUSIV

Simbolul operatiei SAU-EXCLUSIV este ^

Conform tabelei operatiei SAU-EXCLUSIV la fel ca in exemplele anterioare se vor face operatiunile bit cu bit.

Operatorul complement fata de 1

Simbolul opearatiei complement este ~.

Operatorul face complementul fata de 1 al unui numar intreg , cu alte cuvinte se schimba 1 in 0 si 0 in 1 pentru fiecare bit.

Operatorul conditional

Operatorul conditional este un operator ternar.

El are urmatoarea forma:

expresie_1 ? expresie_2 : expresie 3

Evaluarea expresiei conditionale se face in felul umator :

a) se evalueaza prima expresie: expresie_1

b) daca expresia este diferita de zero atunci rezultatul va fi expresia_2;

c) daca expresia este 0 atunci rezultatul va fi a treia expresie: expresie_3.

Exemplul 2.7.5.1.

Z=(a > b) ? a : b

Dupa evaluare Z va avea valoarea a daca a > b sau valoarea b daca a < b. Deci Z va contine maximul dintre cele 2 numere.

Operatorul conditional poate fi substituit cu o instructiune if.

if (a > b)

Z=a;

else

Z=b;

Folosirea operatorului conditional duce la un cod mai succint.

Exemplul 3.10.6.

Sa reproiectam functia lower (c) folosind operatorul conditional.

int lower (c)

int c;

Tipul rezultatului depinde de tipul expresiilor 2 si 3.

Expresiile 2 si 3 vor fi aduse la un tip comun. Regulile de conversie sunt cele aratate in paragrafele precedente.

Pentru expresia z = (a < b) ? a : b daca a este de tip float si b de tip int rezultatul va avea tipul float indiferent de rezultatul evaluarii deoarece va avea loc conversia la float a expresiei 3.

Deci indiferent de valorile a si b rezultatul va fi float.

Operatori de incrementare si decrementare

Operatorii de incrementare ++ si decrementare -- se folosesc numai asupra variabilelor si au aceeasi prioritate ca si operatorul unar -. Ei se asociaza de la stanga la dreapta.

Efectul este incrementarea cu 1 (decrementarea cu 1) a variabilelor. Ambii operatori pot fi folositi ca prefix si postfix.

Exemplul 2.7.6.1.

++ i;

i ++;

Efectul asupra variabilei este acelasi indiferent de notatia folosita : postfix sau prefix.

Intr-o instructiune de atribuire daca avem :

1) n=6; 2) n=6;

x=++n; x=n++;

n va deveni 7 in ambele cazuri . Dar in primul caz x=7 si in al doilea caz x=6.

Deci in notatia prefix intai se incrementeaza variabila si apoi se foloseste valoarea ei.

In notatia postfix se incrementeaza variabila dupa folosirea valorii ei.

Exemplul 2.7.6.2.

#include <stdio.h>

main()

Exemplul 2.7.6.3.

#include <stdio.h>

main()

Operatorul virgula

Operatorul virgula se foloseste pentru a grupa mai multe expresii intr-una singura , expresii care se vor evalua succesiv.

Operatorul virgula are cea mai mica prioritate dintre toti operatorii

limbajului C.

Se pot construi cu ajutorul acestui operator expresii de forma :

exp_1,exp_2, ... ,exp_n

Valoarea si tipul intregii expresii coincid cu valoarea si tipul lui exp_n.

Exemplul 3.10.7.1.

t=(x < 5 , x=x+2 , p=1 , k)

Se executa pe rand x < 5 , x=x+2 , p=1 dupa care t va fi egal cu k si va avea tipul lui k.



Document Info


Accesari: 3217
Apreciat: hand-up

Comenteaza documentul:

Nu esti inregistrat
Trebuie sa fii utilizator inregistrat pentru a putea comenta


Creaza cont nou

A fost util?

Daca documentul a fost util si crezi ca merita
sa adaugi un link catre el la tine in site


in pagina web a site-ului tau.




eCoduri.com - coduri postale, contabile, CAEN sau bancare

Politica de confidentialitate | Termenii si conditii de utilizare




Copyright © Contact (SCRIGROUP Int. 2024 )