Elemente ale limbajului C
A. Cuvinte cheie
Standard: |
auto |
double |
int |
struct |
break |
else |
long |
switch |
|
case |
enum |
register |
typedef |
|
char |
extern |
return |
union |
|
const |
float |
short |
unsigned |
|
continue |
for |
signed |
void |
|
default |
goto |
sizeof |
volatile |
|
do |
if |
static |
while |
B. Tipuri predefinite (standard)
Identificator |
sizeof (PC) |
Domeniul de valori |
Descriptori conversie |
Exemple de constante |
Char signed char |
1 |
-128 .. 127 |
%c %i %d %x %o |
'A' 0x41 '\n' |
Unsigned char |
1 |
0 .. 255 | ||
int signed int |
2 |
-32768 .. 32767 |
%i %d %x %o |
12 0xC |
Short int signed short int |
%hi %hd %hx %ho |
014 -32500 |
||
unsigned int |
2 |
0 .. 65535 |
%u %x %o |
0xfff |
unsigned short int |
%hu %hx %ho |
65535u |
||
long int signed long int |
4 |
-2147483648 .. 2147483647 |
%li %ld %lx %lo |
-1L 300000l |
unsigned long int |
4 |
0 .. 4294967295 |
%lu %lx %lo |
4000000000ul |
float |
4 |
3.4e -38 .. 3.4e+38 |
%f, %e, %g |
1.2 |
double |
8 |
1.7e-308 .. 1.7e+308 |
%lf %le %lg |
8e9 |
long double |
10 |
3.4e-4932 .. 1.1e+4932 |
%Lf %Le %Lg |
-1.23456789 2.5e-30 |
C. Definitii si declaratii
Definitii de noi tipuri (se prezinta forma generala si exemple)
enumerare
enum id_enum ; |
enum raspuns ; |
|
typedef enum id_tip_enum ; |
typedef enum Logic ; |
structura
struct id_str ; |
struct produs ; |
|
typedef struct id_s /* id_s poate lipsi */ id_tip_str; |
typedef struct TData; |
tablou
typedef id_tip_t[dim]; |
typedef int VectInt[200]; |
referinta (pointer) la valoare de tip Tval
typedef TVal * tip_pointer; |
typedef int * AdrInt; typedef TProdus * PProdus; |
referinta (pointer) la functie
typedef int (* tip_func)(lista_tipuri_param); |
typedef int (* TF)(int, VectInt); |
sinonim tip predefinit sau deja definit de utilizator
typedef id_tip_existent id_sinonim; |
typedef unsigned long Ulong; typedef char Byte; typedef enum raspuns TRasp; typedef struct produs TProdus; |
Declaratii de variabile
simple, de tip predefinit sau definit de utilizator prin enum, struct sau typedef
tip lista_id_var; tip id_var = initializare; |
VectInt x, y; int nx = 0; TF axx; enum raspuns r = Nedecis; TData start = ; |
referinta la tip predefinit sau definit de utilizator prin enum, struct sau typedef
tip * id_var; tip * id_var = initializare; |
int * anx; TData * astart = &start; |
referinta (pointer) la functie
tip_rez (* id_var)(lista_tipuri_parametri); |
int (* af)(int, VectInt); |
prototip functie
tip_rez idf (lista_tipuri_parametri); tip_rez idf (lista_parametri); |
int Max2i (int, int); int MinVect (int nv, VectInt v); |
tablou, cu dim elemente de acelasi tip (tip_el)
tip_el idt[dim]; tip_el idt[dim]=; tip_el idt[]=; /* dimensiune = numar valori initiale */ |
int a[200]; TData date[50]; int numere[5]= ; char mesaj[] = "Buna ziua"; |
D. Accesul la valorile si adresele variabilelor
Variabila simpla:
valoare : |
x |
|
adresa : |
&x |
Vector v cu dim elemente de tip t, cu indici intre 0 si dim-1 (vectorul ocupa dim * sizeof(t) octeti):
adresa vectorului : |
v |
|
Adresa elementului cu indice i : |
v+i sau &v[i] |
|
Valoarea elementului cu indice i : |
v[i] sau *(v+i) |
Structura s:
adresa structurii : |
&s |
|
adresa campului x : |
&(s.x) |
|
valoarea campului x : |
s.x |
Pointer p la o variabila de tip t:
valoarea variabilei : |
*p |
|
Daca t - tip structura adresa campului x : valoarea campului x : |
&(*p).x sau &p->x (*p).x sau p->x |
Exemple:
E. Operatori
Operator |
Semnificatie |
Asoc |
Operator |
Semnificatie |
Asoc |
|
f(e) |
apel functie |
v1 < v2 |
mai mic | |||
t[i] |
indexare |
v1 <= v2 |
mai mic sau egal | |||
s.c |
selectie |
v1 > v2 |
mai mare |
|
||
p->c |
selectie indirecta |
v1 >= v2 |
mai mare sau egal | |||
a-- |
postdecrementare |
v1 == v2 |
egal | |||
a++ |
postincrementare |
v1 != v2 |
diferit | |||
-n |
schimbare semn |
i1 & i2 |
"si" bit cu bit | |||
+n |
plus unar (fara efect) |
i1 ^ i2 |
"sau exclusiv" bit cu bit | |||
--a |
predecrementare |
i1 | i2 |
"sau" bit cu bit | |||
++a |
preincrementare |
i1 && i2 |
"si" logic (conjunctie) | |||
!i |
negatie logica |
i1 || i2 |
"sau" logic (disjunctie) | |||
0~i |
negare bit cu bit |
i? v1: v2 |
operator conditional | |||
*p |
adresare indirecta |
a = v |
atribuire | |||
&x |
preluare adresa |
a *= v |
a = a * v | |||
sizeof(x) |
determinare dimensiune |
a /= v |
a = a / v | |||
(d)e |
conversie de tip (cast) |
a %= v |
a = a % v | |||
n1 * n2 |
inmultire |
a -= v |
a = a - v | |||
n1 / n2 |
impartire |
a += v |
a = a + v | |||
i1 % i2 |
rest impartire (modulo) |
a &= v |
a = a & v | |||
v1 + v2 |
adunare |
a ^= v |
a = a ^ v | |||
v1 - v2 |
scadere |
a |= v |
a = a | v | |||
i1 << i2 |
deplasare stanga |
a <<= v |
a = a << v | |||
i1 >> i2 |
deplasare dreapta |
a >>= v |
a = a >> v | |||
e1 , e2 |
secventiere |
Legenda:
a - adresa (valoare stanga); c - camp; d - declarator tip; e - expresie; f - functie; i - intreg; n - numar;
p - pointer; s - structura sau uniune; t - tablou; v - valoare; x - entitate
Marea majoritate a operatorilor necesita operanzi de acelasi tip. Aceasta conditie impune, atunci cand operanzii sunt de tipuri diferite, conversia valorii unuia, sau chiar a ambilor operanzi, la acelasi tip, pentru "echilibrare". Regula de echilibrare este urmatoarea:
daca operanzii sunt de tip unsigned int si long
atunci
daca orice unsigned int poate fi reprezentat ca long
atunci tipul echilibrat este long
altfel tipul echilibrat este unsigned long
altfel se alege tipul care apare mai tarziu in secventa
int
unsigned int
long
unsigned long
float
double
long double
Tipul rezultatului operatiei este cel stabilit in urma echilibrarii.
De exemplu, daca se considera valorile intregi s = 76, n = 16 si m = 6 si valoarea de tip double x = s, atunci expresia s / n are valoarea 4, in timp ce expresiile s / (double)n si x / n se evalueaza la 4.75.
De asemenea:
m / n * 100
m * 100 / n
m / (double)n * 100
m * 100. / n
F. Instructiuni
Forma generala |
Semnificatie |
Exemple |
expresie; |
Expresia este o atribuire sau un apel de functie cu efect lateral |
a = 7; printf ("%i\n", a); nn = np = 0; |
Reprezinta corpul unei functii sau o parte dintr-o instructiune structurata (decizie, ciclu etc.) | ||
if (expresie) instructiune_1 else instructiune_2 |
Expresia codifica o conditie. In functie de valoarea expresiei (!= 0 sau == 0) decide ce instructiune se executa (1 sau 2) |
if ( x < y ) min = x; else min = y; |
if (expresie) instructiune |
Executa instructiune numai daca valoarea expresiei este diferita de 0 (adica este indeplinita conditia) |
if ( x < 0 ) negative++; |
switch (expresie_tip_intreg) |
Selectie secventa de prelucrari, astfel: - evalueaza expresia - daca exista eticheta (k_x) egala cu valoarea expresiei atunci continua executia cu secventa corespunzatoare altfel daca exista default atunci executa secventa_d altfel nu se executa nimic Executia continua de la secventa selectata pana la break sau pana la sfarsit. |
switch (c) x = baza; switch (exp) |
while (expresie) instructiune |
Cat timp valoarea expresiei este diferita de 0 (este indeplinita conditia codificata) se repeta instructiunea |
d = x; k = 0; while ( d % y == 0 ) |
do instructiune while (expresie); |
Executa instructiunea cat timp valoarea expresiei este diferita de 0 |
do while (n <= 0); |
for (expr_i; expr_c; expr_a) instructiune |
Este echivalenta cu: Expresiile pot fi si secvente de forma e1, e2,... sau pot lipsi |
for(s = i = 0, p = 1; i < n ; i++ ) for(d = x, k = 0; d % y == 0; d /= y, k++ ); |
Forma generala |
Semnificatie |
Exemple |
break; |
Iesire fortata dintr-un ciclu (do, for, while) sau selectie (switch) |
for (i = 0; i < n; i++) if ( v[i] == x ) break; |
continue; |
Salt la sfarsitul corpului unui ciclu (deci nu se mai executa instructiunile care urmeaza dupa continue). |
k = 0; s = 0; for (i = 0; i < n; i++) |
return expresie; |
Termina executia corpului unei functii, intorcand ca rezultat valoarea expresiei. |
int Min (int a, int b) int XX (int v[], int n) |
return ; |
Termina executia corpului unei functii cu rezultat de tip void. |
void Inv (int *a, int *b) |
|