Programare in limbajul C – Cursul 3 Expresii şi operatori Prof. univ. dr. Constantin Popescu

Post on 22-Jan-2016

58 views 2 download

description

Programare in limbajul C – Cursul 3 Expresii şi operatori Prof. univ. dr. Constantin Popescu. Agenda. Expresii Operatori aritmetici Operatori de asignare Operatori de incrementare si decrementare Operatori relationali Operatori logici Operatii pe biti Operatorul conditional. Expresii. - PowerPoint PPT Presentation

transcript

Programare in limbajul C – Cursul 3Expresii şi operatori

Prof. univ. dr. Constantin Popescu

Agenda Expresii Operatori aritmetici Operatori de asignare Operatori de incrementare si decrementare Operatori relationali Operatori logici Operatii pe biti Operatorul conditional

Expresii Exemple de expresii:

3 + 5;

x;

x=0;

x=x+1;

printf("%d",x);

Doua tipuri de expresii:– Apeluri de functii– Expresii formate din date si operatori

O expresie in C are de obicei o valoare– exceptie pentru apelurile de functii care returneaza void.

Operatori Aritmetici

Operator Simbol Actiune Exemplu

Adunare + Aduna operanzii x + y

Scadere - Scade al 2 din primul x - y

Negare - Neaga operandul -x

Inmultire * Inmulteste operanzii x * y

Impartire / Imparte 1 la al doilea x / y

Rest % Restul impartirii x % y

Operatorul de asignare x=3

– = este un operator– valoarea acestei expresii este 3– = are urmatorul efect -- asigneaza lui x valoarea 3

Operatorul de asignare =– Asigneaza partii din stinga valoarea din partea dreapta.– Valoarea expresiei va fi valoarea din partea dreapta.

Exemplu:x = ( y = 3 ) +1; /* asigneaza lui y valoarea 3 */

/* valoarea lui (y=3) este 3 */

/* asigneaza lui x valoarea 4 */

Operatori de asignare compusi Adesea se utilizeaza operatorii:

– x=x+1, x=x*2, ...

Limbajul C ofera o forma scurta pentru acestia:– Forma Generica:

variabila op= expr echivalent cu variabila = variabila op expr

– Ultima valoare va fi egala cu valoarea finala a lui expr De exemplu: x=3; y= (x+=3); /* x si y au fiecare valoarea 6 */

Operator Echivalent cu:

x *= y x = x * y

y -= z + 1 y = y - (z + 1)

a /= b a = a / b

x += y / 8 x = x + (y / 8)

y %= 3 y = y % 3

Operatori de Incrementare si Decrementare

Operatori pre- si post-incrementare si decrementare:– Incrementare: ++ ++x, x++

++x este echivalent cu : (x = x + 1)

– Are valoarea xvechi +1

– Este incrementat x x++

– Are valoarea xvechi

– Este incrementat x– Decrementare -- --x, x--

similar cu ++

Operatori Relationali Operatorii relationali permit compararea variabilelor:

– Ei returneaza val. 1 pentru true si val. 0 pentru false.

Operator Simbol Exemplu

Egalitate == x == y diferit de x = y

Mai mare > x > y

Mai mic < x < y

Mai mare/egal >= x >= y

Mai mic/egal <= x <= y

Inegalitate != x != y

Nu exista tipul boolean in C. In C se foloseste:– 0, pentru false (fals)– Intreg diferit de zero, pentru true (adevarat)

Operatori Logici

&& si || sau ! negare (operator unar)

!((a>1)&&(a<10))||((a<-1)&&(a>-10))

Operatii pe biti (1) C permite reprezentarea pe biti a variabilelor

intregi Toti intregii pot fi reprezentati in forma binara:

– De exemplu, daca avem intregul pe 16-biti: 6552010 = 1111 1111 1111 00002 = FFF016 =

1777608

In C, numerele hexazecimale incep cu 0x si numerele octale incep cu 0:

x=65520; baza 10 x=0xfff0; baza 16 (hex) x=0177760; baza 8 (octal)

Operatii pe biti (2)Operatori pe biti: Operatorul deplasare (shift):

– x << n (la stinga) Deplaseaza bitii cu n pozitii la stinga, punind zero in dreapta. Daca x = 1111 1111 1111 00002

x << 1 este 1111 1111 1110 00002

– x >> n (la dreapta) Deplaseaza bitii cu n pozitii la dreapta:

– Punind 1 in partea stinga daca este un intreg cu semn– Punind 0 in partea stinga daca este un intreg fara semn

x >> 1 este 0111 1111 1111 10002 (fara semn)

x >> 1 este 1111 1111 1111 10002 (cu semn)

Operatii pe biti (3) Operatori logici pe biti:

– Se aplica tuturor tipurilor intregi: & Şi pe biti

x= 0xFFF0 1111 1111 1111 0000 y= 0x002F & 0000 0000 0010

1111 x&y= 0x0020 0000 0000 0010 0000

| SAU pe biti x|y= 0xFFFF 1111 1111 1111 0000

| 0000 0000 0010 1111

1111 1111 1111 1111 ^ SAU EXCLUSIV pe biti

x^y= 0xFFDF ~ COMPLEMENT pe biţi

~ y= 0xFFD0– Inlocuieste fiecare bit 0 cu 1 şi fiecare bit 1 cu 0

Inmultire si Impartire cu 2 Inmultirea si impartirea cu 2 este adesea mai lenta

decit deplasarea pe biti. Inmultirea cu 2 poate fi inlocuita cu deplasarea cu 1 bit

la stinga:n = 10printf(“%d = %d” , n*2, n<<1);printf(“%d = %d”, n*4, n<<2);……

Impartirea cu 2 poate fi inlocuita cu deplasarea cu 1 bit la dreapta:

n = 10printf(“%d = %d” , n/2, n>>1);printf(“%d = %d”, n/4, n>>2);

Precedenta OperatorilorOperator Nivelul de precedenta

( ) 1~, ++, --, unar - 2*, /, % 3+, - 4<<, >> 5<, <=, >, >= 6==, != 7& 8

^ 9 | 10

&& 11|| 12=, +=, -=, etc. 14

Exemplu Care este diferenta dintre cele doua linii de la iesire (output)?

#include <stdio.h>

int main ()

{

int w=10,x=20,y=30,z=40;

int temp1, temp2;

temp1 = x * x /++y + z / y;

printf ("temp1= %d;\nw= %d;\nx= %d;\ny= %d;\nz= %d\n",

temp1, w,x,y,z);

y=30;

temp2 = x * x /y++ + z / y;

printf ("temp2= %d;\nw= %d;\nx= %d;\ny= %d;\nz= %d\n",

temp2, w,x,y,z);

return 0;

}

Operatorul Conditional Forma generica:

exp1 ? exp2 : exp3 daca exp1 este true (non-zero)

valoarea este exp2

(exp3 nu este evaluata)

daca exp1 este falsa (0),

valoarea este exp3

(exp2 nu este evaluata) Exemplu:

z = (x > y) ? x : y; Aceasta este echivalent cu:

if (x > y)

z = x;

else

z = y;

Funcţia printf (1) Există o serie de specificatori de format pentru funcţia printf.

Specificator Semnificatie

%d tipăreşte argumentul de tip int în format zecimal

%ld tipăreşte argumentul de tip long int în format zecimal

%c tipăreşte un caracter

%s tipăreşte un şir de caractere

%f tipăreşte un argument de tip float sau double

%e la fel ca %f, dar foloseşte notaţia exponenţială

%g foloseşte %e sau %f, care e mai bun

%o tipăreşte un argument de tip int în baza 8

%x tipăreşte un argument de tip int în baza 16

%% tipăreşte %

Funcţia printf (2) Apelul:

printf("%c %d %f %e %s %d%%\n", '1', 2, 3.14, 56000000., "opt", 9);

va tipări:

1 2 3.140000 5.600000e+07 opt 9% Apelul:

printf("%d %o %x\n", 100, 100, 100);

va tipări:

100 144 64 Apeluri succesive ale funcţiei printf vor genera ieşirile una după

alta, astfel apelurile de mai jos vor afişa Hello, world! (pe o singură linie):

printf("Hello, ");

printf("world!\n");

Funcţia printf (3) Un exemplu de utilizare a functiei printf:

#include <stdio.h>

int main()

{

int ten=10,x=42;

char ch1='o', ch2='f';

printf("%d%% %c%c %d is %f\n",

ten,ch1,ch2,x, 1.0*x / ten );

return 0;

}

Funcţia scanf (1) Functia scanf este asemanatoare cu printf:

– Este o functie din biblioteca C: <stdio.h>– Specificatorii de format sunt aceeasi ca la functia printf

Exemple:scanf ("%d", &x); /* citeste un numar intreg */

scanf ("%f", &rate); /* citeste un numar real */

int n1, n2; float f;

scanf("%d%d%f",&n1,&n2,&f);

(Trebuie sa fie adaugate spatii pentru a separa numerele.)

Caracterul & este utilizat pentru adresa unei variabile

Funcţia scanf (2)Exemplu:

int main()

{

int x;

long y;

float a;

double b;

scanf("%d %ld %f %lf", &x, &y, &a, &b);

printf("%d %ld %f %lf", x, y, a, b);

return 0;

}