O constantă este o valoare fixă scrisă direct în cod; o variabilă este un nume asociat unei zone de memorie al cărei conținut se poate schimba. Tipul ales pentru fiecare determină cât spațiu ocupă, ce valori poate lua și ce operații se pot aplica.
1Obiectivele lucrării
- Scrierea constantelor întregi în bazele 10, 8 și 16 și folosirea sufixelor
UșiL - Utilizarea constantelor reale, caracter și șir de caractere, inclusiv a secvențelor escape
- Declararea variabilelor cu tipul potrivit domeniului de valori
- Determinarea experimentală a dimensiunilor cu operatorul
sizeof - Distingerea domeniului de vizibilitate de durata de viață a unei variabile
2Constante
Constantele literale sunt valori fixe care nu pot fi modificate în timpul execuției. Tipul lor este determinat automat de compilator, pe baza valorii și a sintaxei folosite.
Constante întregi
| Bază | Convenție de scriere | Exemple |
|---|---|---|
| Zecimală (10) | prima cifră diferită de 0 | 23, -555L, 3276L |
| Octală (8) | prima cifră este 0; cifrele 8 și 9 sunt ilegale | 067, -067, 067u |
| Hexazecimală (16) | prefix 0x sau 0X | 0x1F, 0xFFu, 0xAB3L |
int x = 010; nu înseamnă zece, ci opt - prefixul 0 declanșează
interpretarea în baza 8. Este o greșeală frecventă la scrierea datelor calendaristice sau a codurilor
cu zerouri nesemnificative.Determinarea implicită a tipului
| Situație | Tip atribuit | Exemplu |
|---|---|---|
valoarea încape în domeniul int | int | 15, 23 |
depășește int, încape în long | long | 99999 |
depășește long | double | 98765432100 |
Tipul implicit poate fi forțat cu sufixe: U/u pentru unsigned,
L/l pentru long, combinate în UL.
Constante caracter și secvențe escape
| Secvență | Semnificație | Cod ASCII |
|---|---|---|
'\n' | linie nouă | 10 |
'\t' | tabulator orizontal | 9 |
'\r' | retur de car | 13 |
'\0' | caracter nul - marchează sfârșitul unui șir | 0 |
'\\' | backslash | 92 |
'\'' | apostrof | 39 |
'A' este o constantă caracter și ocupă
1 octet. "A" este un șir și ocupă 2 octeți: litera plus terminatorul
'\0'. Confuzia dintre ele produce erori greu de depistat.3Tipuri fundamentale de date
| Tip | Dimensiune tipică | Domeniu de valori | Specificator printf |
|---|---|---|---|
char | 1 octet | −128 … 127 | %c / %d |
unsigned char | 1 octet | 0 … 255 | %u |
short | 2 octeți | −32 768 … 32 767 | %hd |
int | 4 octeți | −2 147 483 648 … 2 147 483 647 | %d |
unsigned int | 4 octeți | 0 … 4 294 967 295 | %u |
long long | 8 octeți | ±9,2 · 10¹⁸ | %lld |
float | 4 octeți | ±3,4 · 10³⁸, ~7 cifre semnificative | %f |
double | 8 octeți | ±1,7 · 10³⁰⁸, ~15 cifre semnificative | %lf |
bool (C++) | 1 octet | true / false | - |
char ≤ short ≤ int ≤ long). Pe un microcontroler
pe 8 biți, int are 2 octeți; pe un PC obișnuit, 4. De aceea se verifică întotdeauna
cu sizeof.4Variabile
Declarația unei variabile rezervă spațiu în memorie și îi asociază un nume și un tip:
tip nume; // declarație simplă, valoare nedefinită tip nume = valoare; // declarație cu inițializare tip n1, n2, n3; // mai multe variabile de același tip const tip nume = valoare; // valoare care nu mai poate fi modificată
5Vizibilitate și durată de viață
| Clasă | Unde este vizibilă | Cât trăiește | Valoare inițială implicită |
|---|---|---|---|
auto (locală) | în blocul în care e declarată | până la ieșirea din bloc | nedefinită |
static locală | în blocul în care e declarată | toată execuția programului | 0 |
| globală | în tot fișierul, după declarație | toată execuția programului | 0 |
extern | în alte fișiere sursă | toată execuția programului | 0 |
register | în blocul în care e declarată | până la ieșirea din bloc | nedefinită |
static locală este vizibilă doar
în funcția ei, dar nu este distrusă la ieșire: la următorul apel își regăsește valoarea.
Este mecanismul standard pentru contoare care trebuie să rețină starea între apeluri.6Simulator de execuție
Urmăriți pas cu pas cum se comportă o variabilă locală obișnuită față de una
declarată static, la trei apeluri succesive ale aceleiași funcții.
7Cod sursă
#include <stdio.h>
#include <limits.h>
int main(void)
{
printf("Tip Octeti Minim Maxim\n");
printf("-------------------------------------------------------\n");
printf("char %2zu %-18d %d\n", sizeof(char), CHAR_MIN, CHAR_MAX);
printf("short %2zu %-18d %d\n", sizeof(short), SHRT_MIN, SHRT_MAX);
printf("int %2zu %-18d %d\n", sizeof(int), INT_MIN, INT_MAX);
printf("long %2zu %-18ld %ld\n", sizeof(long), LONG_MIN, LONG_MAX);
printf("float %2zu\n", sizeof(float));
printf("double %2zu\n", sizeof(double));
return 0;
}
#include <stdio.h>
int main(void)
{
int zecimal = 100; // baza 10
int octal = 0144; // baza 8 -> tot 100
int hexazecimal = 0x64; // baza 16 -> tot 100
printf("%d %d %d\n", zecimal, octal, hexazecimal); // 100 100 100
// aceeasi valoare afisata in baze diferite
printf("zecimal: %d octal: %o hexa: %X\n", 255, 255, 255);
// capcana zeroului din fata
int gresit = 010;
printf("010 inseamna %d, nu 10!\n", gresit); // 8
// caracter vs sir
char c = 'A';
char s[] = "A";
printf("sizeof('A') in C = %zu, sizeof(\"A\") = %zu\n", sizeof(c), sizeof(s));
return 0;
}
#include <stdio.h>
int main(void)
{
short mic = 32767; // valoarea maxima pentru short
printf("inainte: %d\n", mic);
mic = mic + 1; // depasire!
printf("dupa +1: %d\n", mic); // -32768, se trece la valoarea minima
unsigned char u = 255;
u = u + 1;
printf("unsigned char 255+1 = %u\n", u); // 0, revine la inceput
return 0;
}
8Atelier de cod
Dimensiunile tipurilor și comportamentul la depășire nu se învață din tabele, ci văzându-le. Rulați programele de mai jos și modificați valorile ca să vedeți exact unde se rupe fiecare tip.
9Sarcini de lucru
- Rulați programul de verificare a dimensiunilor și notați valorile obținute pe calculatorul din laborator.
- Scrieți valoarea 200 în bazele 10, 8 și 16 și verificați că afișarea este identică.
- Declarați o variabilă
shortcu valoarea maximă și adunați 1; explicați rezultatul. - Comparați
sizeof('A')în C cusizeof('A')în C++ - rezultatele diferă, explicați de ce. - Scrieți o funcție cu un contor
staticși apelați-o de cinci ori; afișați valoarea la fiecare apel. - Declarați o variabilă locală fără inițializare, afișați-o și rulați programul de trei ori - observați dacă valoarea se schimbă.
- Folosiți toate secvențele escape din tabel într-un singur
printfși observați efectul.
10Aplicație de aprofundare
<limits.h>, valoarea maximă a tipului int de pe calculatorul vostru:
porniți de la 1 și dublați valoarea până când aceasta devine negativă, apoi ajustați. Comparați
rezultatul cu INT_MAX. Repetați pentru unsigned int.