Documente Academic
Documente Profesional
Documente Cultură
Limbajul C
Limbajul C
Paradigme de programare:
- programarea structurată – bazată pe Teorema de structură
- programarea procedurală – bazată pe proiectarea de funcţii separate
- programarea modulară – bazată pe alcătuirea de proiecte din mai multe fişiere
- programarea orientată obiect – bazată pe moştenire şi polimorfism
Un modul este constituit dintr-un set de funcţii înrudite împreună cu datele pe care
acestea le prelucrează, stocate într-un fişier care se compilează separat. Aplicaţia se
dezvoltă sub forma unui proiect prin intermediul căruia se ”leagă” (link-editează)
împreună diversele module componente, creându-se un executabil unic.
f1.h f2.h
f1.cpp f2.cpp
Domeniul local
Un identificator definit în interiorul unui bloc se spune că are domeniul de
valabilitate local (acelui bloc). El este cunoscut şi se poate folosi doar în interiorul
blocului în cauză, mai precis, din punctul imediat ulterior declaraţiei sau definiţiei sale
şi până la paranteza } care se împerechează cu cea mai apropiată (textual) paranteză {
ce precede textul declaraţiei în cauză .
Domeniul funcţie
Domeniul funcţie se referă în special la cazul etichetelor pentru care domeniul
de valabilitate este dat de punctul în care ele sunt folosite şi până la sfârşitul funcţiei
respective.
Domeniul de vizibilitate defineşte acea zonă de program în care un nume îşi păstrează
aceeaşi semnificaţie (aceleaşi atribute). Un nume se poate utiliza numai în interiorul
domeniului său de vizibilitate.
Semnificaţia unui nume într-un anumit punct al unui program este dată de cea mai
apropiată declaraţie care precede punctul în cauză
Domeniul de vizibilitate al unui nume este domeniul de valabilitate din care se exclud
blocurile incluse ce conţin declaraţia unui omonim.
int main(void)
*----- {
¹
¹ printf("%d\n", i); /* afiseaza 1 */
¹
¹ *--- {
¹ ² int i = 2, j = 3; /* i si j locale */
¹ ² /* definitia globala a lui i e ascunsa */
¹ ² printf("%d\n%d\n", i, j); /* afiseaza 2, 3 */
¹ ²
¹ ² *-- {
¹ ²³ int i = 0; /* i este redefinit intr-un bloc indentat */
¹ ²³ /* definitiile anterioare ale lui i sunt ascunse */
¹ ²³ printf("%d\n%d\n", i, j); /* afiseaza 0, 3 */
¹ ² *-- }
¹ ²
¹ ² printf("%d\n", i); /* afiseaza 2 */
¹ ²
¹ *--- }
¹
¹ printf("%d\n", i); /* afiseaza 1 */
¹
¹ return 0;
¹
*------ }
Exemplul 2:
#include <stdio.h>
int x,y;
void subpr(float x)
{
int z;
x=1.0; y=1; z=1;
printf(“Subpr: x=%g\ty=%d\tz=%d\n”,x,y,z);
}
int main(void)
{
x=0; y=0;
printf(“Main I: x=%g\ty=%d\n”,x,y);
subpr(x);
printf(“Main II: x=%g\ty=%d\n”,x,y);
return 0;
}
Tipul de legătură al unui identificator
În cazul în care un program se compune din mai multe module (mai multe fişiere
sursă), o variabilă globală poate fi utilizată într-un fişier sursă în care nu este definită,
doar dacă este declarată ca variabilă externă în acel fişier. O declaraţie de variabilă
externă coincide cu o declaraţie de variabilă obişnuită, precedată de cuvântul rezervat
extern.
Restul identificatorilor se spune că au legătură internă.
Un nume cu domeniul global prefixat de cuvântul rezervat static este local
modulului, având legătură internă.
Clase de alocare
Clasele de alocare precizează locul şi momentul în care se rezervă memorie
pentru o anumită variabilă.
Există trei clase de alocare :
- automatic;
- registru;
- static.
Exemplul 4:
main.cpp
#include “f1.h”
#include “f2.h”
static int i;
static double x;
int main(void)
{
f1();
f2();
return 0;
}
f1.cpp
#include “f1.h”
extern int i ; -- EROARE la link - unresolved externals
void f1(void)
{
….
}