Sunteți pe pagina 1din 44

Scopul cursului

Variabile, operatori și expresii


 Modificatorii tipurilor de date

 Variabile locale şi variabile globale

 Conversia de tip în expresii

 Conversia de tip asignări

 Operatorul cast

 Operatorii pe biţi

 Operatorii deplasare

Programarea calculatoarelor I - Gyorodi


Cornelia 1
Modificatorii tipurilor de date

 Limbajul C are 5 tipuri de date:


 void,
 char,
 int,
 float
 double.
Aceste tipuri, cu excepţia tipului void, pot fi modificate
folosind modificatorii de tip.

Programarea calculatoarelor I - Gyorodi


Cornelia 2
Modificatorii tipurilor de date

 Modificatorii de tip sunt:


 signed
 unsigned
 long
 short
Modificatorii de tip preced tipul de bază, ca în exemplu
de mai jos:
long int i:
Programarea calculatoarelor I - Gyorodi
Cornelia 3
Modificatorii tipurilor de date

 short aplicat la tipul int îi înjumătățește dimensiunea


 unsigned poate fi aplicat pentru char și int
 long poate fi aplicat tipurilor int și double
 signed este folosit cu tipul char ( folosirea lui pentru tipul
int este redundantă)

Programarea calculatoarelor I - Gyorodi


Cornelia 4
Modificatorii tipurilor de date
TYPE Lung. în biţi Domeniu de valori Descriptor de format

char 8 -128 la 127 %c


unsigned char 8 0 la 255 %uc
signed char 8 -128 la 127 %c
int 16 -32768 la 32767 %d
unsigned int 16 0 la 65535 %ud
short int 16 -32768 la 32767 %hd
long int 32 -2147483648 la 2147483647 %ld

unsigned long int 32 0 la 4294967295 %lu

float 32 3.4E-38 la 3.4E+38 %f

double 64 1.7E-308 la 1.7E+308 %ld


Programarea calculatoarelor I - Gyorodi
long double 80 3.4E-4932Cornelia
la 1.1E+4932 %Ld 5
Variabile locale și variabile globale

 Există trei locuri în care variabilele pot fi declarate în


limbajul de C
 În interiorul unei funcții sau a unui bloc, caz în care se numesc
variabile locale.
 În afara tuturor funcțiilor, caz în care se numesc variabile
globale.
 În definirea parametrilor unei funcții, caz în care sunt
denumite parametri formali.

Programarea calculatoarelor I - Gyorodi


Cornelia 6
Variabile locale și variabile globale

 Variabilele locale pot fi referite numai de instrucţiunile


care sunt cuprinse în interiorul funcţiei în care sunt
declarate, deoarece ele nu sunt cunoscute în exteriorul
funcţiei.
 O variabilă locală este creată după intrarea în funcţia
care o declară şi este distrusă înainte de ieşirea din
această funcţie.
 Variabilele locale trebuiesc declarate la începutul funcţiei
în care ele sunt definite, înaintea oricărei instrucţiuni.
Programarea calculatoarelor I - Gyorodi
Cornelia 7
Variabile locale

 Variabile locale - variabilele declarate în interiorul unei


funcţii.
 Ele pot fi utilizate numai de instrucțiunile care se află în
acea funcție.
 Variabilele locale nu sunt cunoscute de funcții în afara
acestora.

Programarea calculatoarelor I - Gyorodi


Cornelia 8
Exemplu – variabile locale
#include <stdio.h>
int main ()
{
/* Declararea variabilelor locale */
int a, b; int c;
/* initializarea variabilelor */
a = 10; b = 20; c = a + b;
printf ("value of a = %d, b = %d and c = %d\n", a, b, c);
return 0;
}

Programarea calculatoarelor I - Gyorodi


Cornelia 9
Variabile globale

 Variabile globale sunt variabilele declarate în exteriorul funcţiilor.


 Variabilele globale sunt definite în afara unei funcții, de obicei
deasupra programului.
 Variabilele globale își păstrează valorile pe toată durata de viață a
programului și pot fi accesate din oricare dintre funcțiile
programului.
 O variabilă globală poate fi accesată de orice funcție. Adică, o
variabilă globală este disponibilă pentru utilizare în întregul
program după declararea acesteia.

Programarea calculatoarelor I - Gyorodi


Cornelia 10
Exemplu – variabile globale
#include <stdio.h>
/* declararea variabilelor globale */
int g;
int main ()
{
/* declararea variabilelor locale */
int a, b;
/* initializarea variabilelor */
a = 10; b = 20; g = a + b;
printf ("value of a = %d, b = %d and g = %d\n", a, b, g);
return 0;
}

Programarea calculatoarelor I - Gyorodi


Cornelia 11
Definiția unei funcții

 Definiția unei funcții are următoarea sintaxă generală:

tip_rezultat_returnat nume_functie (lista_parametri_formali) /*antet funcție*/


{
definirea variabilelor locale
instructiuni
}
 Lista parametrilor formali ai unei funcţii sunt de asemenea
variabile locale.
Programarea calculatoarelor I -
Gyorodi Cornelia 12
Exemplu - Parametrii formali
 Parametrii formali, sunt tratați ca variabile locale într-o funcție și au
prioritate față de variabilele globale.
#include <stdio.h>
/* global variable declaration */
int a = 20;
int main ()
{
/* local variable declaration in main function */
int a = 10;
int b = 20;
int c = 0;
printf ("value of a in main() = %d\n", a);
c = sum( a, b);
printf ("value of c in main() = %d\n", c);
return 0;
}
13
Exemplu - Parametrii formali

/* function to add two integers */


int sum(int a, int b)
{
printf ("value of a in sum() = %d\n", a);
printf ("value of b in sum() = %d\n", b);
return a + b;
}

Programarea calculatoarelor I - Gyorodi


Cornelia 14
Exemplu
 Programul care folosește valoarea unei variabile globale pentru controlul ciclului for a unei funcții.
#include <stdio.h>

int max; //variabila globala


void f1();
int main (void)
{
max = 10;
f1();
return 0;
}

void f1()
{
int i; // variabila locala
for ( i = 0; i < max; i++ )
printf ( " %d " , i );
}
Mai multe detalii în Bibl1 Exemplu 4.1
15
Variabile locale și variabile globale

 Numele unei variabile este unic (nu pot exista mai multe
variabile cu același nume)

 O variabilă locală poate avea numele uneia globale, caz


în care în interiorul funcției, e valabilă noua semnificație
a numelui (acea a variabilei locale).

Programarea calculatoarelor I - Gyorodi


Cornelia 16
Exemplu
 Programul în care o variabilă globală este redeclarată în interiorul unei funcții.
#include <stdio.h>
#include <stdlib.h>

int f1(int a, float b); int f1(int a, float b) {


float x; int x, c = 1;
int main(void) {
int a, b = 2, c; x = a + b + c;
a = b + 3; printf("Local x = %d\n", x);
printf("Global x = "); return x;
scanf("%f", &x); }
c = f1(2, x);
return EXIT_SUCCESS;
}
Mai multe detalii în Bibl1 Exemplu 4.2
Programarea calculatoarelor I - Gyorodi Cornelia 17
Variabile locale şi variabile globale
# include < stdio.h >
int max; / * aceasta este o variabila globala * /
void main (void)
{
max = 10;
f1();
}

void f1()
{
int i; / * aceasta este o variabila locala * /
for ( i = 0; i < max; i++ )
printf ( " %d " , i )
}
 Se observă că atât funcţia main( ) cât şi f1( ) folosescc variabila globală max. Funcţia main( )
setează la 10 valoarea lui max, iar f1( ) foloseşte această valoare pentru a controla ciclul for.

18
Domeniul de vizibilitate a unui identificator

Programarea calculatoarelor I - Gyorodi


Cornelia 19
Conversia de tip în expresii

 Limbajul C permite folosirea în aceeaşi expresie a unor


date de tip diferit.
 Este permisă folosirea unor date de tip diferit în
aceeaşi expresie
 C are un set de reguli de conversie care rezolvă
diferenţele de tip - type promotions.
 compilatorul C va converti toţi operanzii în sus, către
tipul celui mai lung operand
Programarea calculatoarelor I - Gyorodi
Cornelia 20
Conversia de tip în expresii

 Type promotion este activ numai in timpul


evaluării unei expresii.

 Variabila nu devine fizic mai largă - compilatorul


foloseşte doar o copie temporară a valorii
variabilei.

Programarea calculatoarelor I - Gyorodi


Cornelia 21
Conversia de tip în expresii

In expresii pot fi conversii:


 implicite
long double unsigned long

double long

float unsigned int

int
 explicite – folosind oparatorul cast
(double)9 => 9.0
22
Exemplu – conversia de tip în expresii
Folosirea într-o expresie a unor date de tip diferit.
char ch;
int i;
float f;
double x;

ch = '0';
i = 10;
f = 10.3;
x = ch * i / f; /*aici toţi sunt convertiţi la double */

Programarea calculatoarelor I -
Gyorodi Cornelia 23
Exemplu – conversia de tip în expresii
Conversia implicită la double a expresiei
#include <stdio.h>

int main (void)


{
int i ;
float f ;

i = 10 ;
f = 20.25 ;
printf ( "%f ", i * f ) ; /* se va afisa 200.25 ,i se evalueaza
la float*/
}
Mai multe detalii în Bibl1 Exemplu 4.4

Programarea calculatoarelor I - Gyorodi


Cornelia 24
Operatorul cast

Operatorul cast are următoarea formă generală :


(type) value
 Operatorul cast permite modificarea temporară a tipului unei
variabile
 Nu poate fi aplicat unei variabile care se află în partea stângă a
unei instrucțiuni de asignare.

int num;
(float) num =123.23 /* incorect*/
Programarea calculatoarelor I - Gyorodi
Cornelia 25
Exemplu
# include < stdio.h >
# include < math.h >
{
int i;
for(i=0; i<101; i++)
printf((“%d %lf \n”, i, sqrt((double)i);
/* i este convertit la double folosind operatorul cast */
}

Programarea calculatoarelor I - Gyorodi


Cornelia 26
Conversia de tip în asignări

 Într-o instrucțiune de asignare în care tipul părții din


dreapta semnului egal diferă de cel al părții din stânga,
tipul părții din dreapta este convertit în cel al părții din
stânga.
 Dacă tipul părții din stânga este de lungime mai mică
decât tipul părții din dreapta, se produce o pierdere de
informație.

Programarea calculatoarelor I - Gyorodi


Cornelia 27
Conversia de tip în asignări
# include <stdio.h>
main()
{
char ch ;
int i;
i=1000;
ch=i; /* se va produce o pierdere de informatie*/
printf (" %d", ch ) ; /* se va afisa numai cei 8 biti inferiori
ai lui i, numarul -24*/
}

Programarea calculatoarelor I - Gyorodi


Cornelia 28
Conversia de tip în asignări

 Când este convertit tipul int în tipul char printr-o


instrucțiune de asignare sunt pierduți 8 biți( cei mai
semnificativi)
 Când este convertit long int în short int printr-o
instrucțiune de asignare sunt pierduți 16 biți ( cei mai
semnificativi).
 Când se convertește un long double în double sau un
double în float, are loc o micșorare a preciziei.

Programarea calculatoarelor I - Gyorodi


Cornelia 29
Operatorii pe biți

 Limbajul C conține 4 operatori care efectueazã operații la nivel de


bit. Aceștia sunt :
& - operatorul AND
| - operatorul SAU
^ - operatorul SAU-EXCUSIV
~ - operatorul complement față de 1.
 Acești operatori lucrează cu date tip char și int, ei nu pot fi
utilizați cu date de tip float.

Programarea calculatoarelor I - Gyorodi


Cornelia 30
Operatorii pe biți

 Operatorii AND, OR și XOR produc rezultate bazate pe


compararea biților corespondenți din cei doi operanzi.
 Operatorul AND setează un bit pe 1 dacă ambii biți sunt
1
 Operatorul OR setează un bit pe 1 dacă oricare dintre
biți este 1
 Operatorul XOR setează un bit pe 1 când unul sau altul
dintre biți este 1, nu când ambii sunt 1 sau 0.
Programarea calculatoarelor I - Gyorodi
Cornelia 31
Operatorii pe biți

b1 b2 b1&b2 b1^b2 b1|b2

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

Programarea calculatoarelor I - Gyorodi


Cornelia 32
Operatorii pe biți

 Exemplu: Să presupunem că A = 60 și B = 13, reprezentarea în


format binar și operatorii pe biți cu acestea vor fi după cum
urmează:
A = 0011 1100
B = 0000 1101
-----------------
A&B = 0000 1100
A|B = 0011 1101
A^B = 0011 0001
~A = 1100 0011

Programarea calculatoarelor I - Gyorodi


Cornelia 33
Exemplu - Operatorii pe biți
#include <stdio.h>
main() {
unsigned int a = 60; /* 60 = 0011 1100 */
unsigned int b = 13; /* 13 = 0000 1101 */
int c = 0;
c = a & b; /* 12 = 0000 1100 */
printf("Line 1 - Value of c is %d\n", c );
c = a | b; /* 61 = 0011 1101 */
printf("Line 2 - Value of c is %d\n", c );
c = a ^ b; /* 49 = 0011 0001 */
printf("Line 3 - Value of c is %d\n", c );
c = ~a; /*-61 = 1100 0011 */
printf("Line 4 - Value of c is %d\n", c );
c = a << 2; /* 240 = 1111 0000 */
Programarea calculatoarelor I - Gyorodi
Cornelia 34
Exemplu - Operatorii pe biți

printf("Line 5 - Value of c is %d\n", c );


c = a >> 2; /* 15 = 0000 1111 */
printf("Line 6 - Value of c is %d\n", c );
}

Rezultatul executiei programului:


Line 1 - Value of c is 12
Line 2 - Value of c is 61
Line 3 - Value of c is 49
Line 4 - Value of c is -61
Line 5 - Value of c is 240
Line 6 - Value of c is 15

Programarea calculatoarelor I - Gyorodi


Cornelia 35
Operatorii de deplasare
 Operatorul << se numește deplasare spre stânga,
 Operatorul >> se numește deplasare spre dreapta.
 Operatorii de deplasare pot fi aplicați numai operatorilor de tip int și char.
Ei au următoarele forme generale :

variabila << expresie_întreagă


variabila >> expresie_întreagă

 Valoarea lui expresie_întreagă determină cu câte poziții vor fi deplasați


spre stânga sau spre dreapta biții variabilei.

Programarea calculatoarelor I - Gyorodi


Cornelia 36
Operatorii deplasare (shift)

 Fiecare deplasare la stânga va face ca toți biții variabilei


specificate să fie deplasați la stânga cu o poziție, iar în
locul rămas liber în dreapta se introduce zero.

 Fiecare deplasare la dreapta va face ca toți biții


variabilei specificate sã fie deplasați la dreapta cu o
poziție iar în locul rãmas liber în stânga se introduce
zero.

Programarea calculatoarelor I - Gyorodi


Cornelia 37
Operatorii deplasare (shift)

 O deplasare spre stânga cu o poziție este echivalentă cu


o multiplicare cu doi a variabilei.
 O deplasare spre dreapta cu o poziție este echivalentă
cu o impărțire a variabilei cu 2.
 Operatorii de deplasare sunt mai rapizi decât operațiile
aritmetice echivalente.

Programarea calculatoarelor I - Gyorodi


Cornelia 38
Exemplu cu operatorii de deplasare

a a<<1 a<<2 a>>1 a>>2


00000001 00000010 00000100 00000000 00000000
1 2 4 0 0
00000010 00000100 00001000 00000001 00000000
2 4 8 1 0
00000110 00001100 00011000 00000011 00000001
6 12 24 3 1
39
Exemplu
 Programul realizează operațiile și respectiv sau la nivel de bit dintre un număr inițializat pe 1
și o mască setată inițial pe 0, numărul își modifică valoarea prin setarea biților utilizând
operatorii de deplasare.
#include <stdio.h>
int main()
{
int masca=0, nr=1;
int i,p=2,n=3, tmp1,tmp2;
nr<<=p; // seteaza bitul 1 pe pozitia p
for(i=1;i<=n;i++){
tmp1=masca;
masca|=nr;
printf("%d SAU %d = %d \n", tmp1, nr, masca);
tmp2 =masca;
masca &=nr;
printf("%d SI %d= %d \n", tmp2, nr, masca);
nr<<=i;
} 40
Exemplu (continuare)
printf("Nr = %d\n", nr);
nr>>=1;
printf("Nr deplasat la dreapta cu 1 =%d \n", nr);
return 0;
}

Mai multe detalii în Bibl1 Exemplu 4.7

Programarea calculatoarelor I - Gyorodi


Cornelia 41
Exemplu – Operatorii in C
 #include <stdio.h>
main() {
int a = 21;
int c ;
c = a;
printf("Line 1 - = Operator Example, Value of c = %d\n", c );
c += a;
printf("Line 2 - += Operator Example, Value of c = %d\n", c );
c -= a;
printf("Line 3 - -= Operator Example, Value of c = %d\n", c );
c *= a; printf("Line 4 - *= Operator Example, Value of c = %d\n", c );
c /= a; printf("Line 5 - /= Operator Example, Value of c = %d\n", c );
c = 200;

Programarea calculatoarelor I - Gyorodi


Cornelia 42
Exemplu – Operatorii in C
 c %= a;
printf("Line 6 - %= Operator Example, Value of c = %d\n", c );
c <<= 2;
printf("Line 7 - <<= Operator Example, Value of c = %d\n", c );
c >>= 2;
printf("Line 8 - >>= Operator Example, Value of c = %d\n", c );
c &= 2;
printf("Line 9 - &= Operator Example, Value of c = %d\n", c );
c ^= 2;
printf("Line 10 - ^= Operator Example, Value of c = %d\n", c );
c |= 2;
printf("Line 11 - |= Operator Example, Value of c = %d\n", c );
}

Programarea calculatoarelor I - Gyorodi


Cornelia 43
Mulțumesc pentru atenție!

44

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