Constante
C++
furnizeaza o notatie pentru valorile de tipuri fundamentale: constante
caracter, constatante intregi si constante in virgula flotanta. In plus, zero
(0) poate fi utilizat ca si o
(1) oricarei valori de orice tip i se poate da un nume si sa fie folosita ca o consatnta adaugind cuvintul cheie const la definitia ei;
(2) un set de constante intregi poate fi definit ca o enumerare;
(3) orice nume de vector sau functie este o
2.4.1. Constante intregi
Constantele intregi pot fi de patru feluri: zecimale, octale, hexazecimale si constante caracter. Constantele zecimale sint cele mai frecvent utilizate si arata asa cum ne asteptam noi:
0 1234 976 12345678901234567890
Tipul unei constante zecimale este int cu conditia ca ea sa incapa intr-un int, altfel ea este long. Compilatorul se cuvine sa avertizeze asupra constantelor care sint prea lungi ca sa fie reprezentate in calculator.
O
Exemple de constante octale:
0 02 077 0123
Exemple de constante in hexazecimal:
0x0 0x2 0x38 0x53
Literele a, b, c, d, e si f sau echivalentele lor in litere mari se utilizeaza pentru a reprezenta 10, 11, 12, 13, 14 si respectiv 15. Notatiile octale si hexazecimale sint mai folositoare pentru a exprima structuri pe biti; utilizind aceste notatii pentru a exprima numere adevarate putem ajunge la surprize. De exemplu, pe o masina pe care un int se reprezinta ca un intreg prin complement fata de 2 pe 16 biti, intregul 0xffff este numarul negativ -1; daca s-ar folosi mai multi biti pentru a reprezenta un int, atunci acesta ar fi 65535.
2.4.2. Constante in flotanta
O
1.23 .23 0.23 1. 1.0 1.2e10 1.23e-15
Sa observam ca nu poate apare un spatiu in mijlocul unei constante flotante. De exemplu:
65.43 e-21
nu este o
65.43 e - 21
si va cauza eroare sintactica.
Daca
noi dorim o
const float pi8 = 3.14159265;
2.4.3. Constante caracter
Desi C++ nu are un tip caracter separat pentru date, ci mai degraba un tip intreg care poate pastra un caracter, trebuie sa avem o notatie speciala si convenabila pentru caractere.
O
'\b' backspace
'\f' formfeed
'\n' newline
'\r' cariage return
'\t' horizontal tab
'\v' vertical tab
'\\' backslash
'\'' simple quote
'\"' double quote
'\0' null, the integer value 0
Acestea sint caractere singulare in ciuda aparentei. Este posibil, de asemenea sa reprezentam un caracter printr-un numar octal de o cifra, doua sau trei (\ urmat de cifre octale) sau de un numar hexazecimal de una, doua sau trei cifre(\x urmat de cifre hexazecimale). De exemplu:
'\6' '\x6' 6 ASCII ack
'\60' '\x30' 48 ASCII '0'
'\137' '\x05f' 95 ASCII '-'
Aceasta face posibil ca sa se reprezinte fiecare caracter din setul caracterelor masina si in particular pentru a include astfel de caractere in siruri de caractere (vezi sectiunea urmatoare). Utilizind o notatie numerica pentru un caracter, programul respectiv nu mai este portabil pentru masini cu seturi diferite de caractere.
2.4.4. Siruri
Un sir constant este o secventa de caractere inclusa intre ghilimele:
"this is a string"
Orice sir constant contine cu un caracter mai mult decit cele care apar in sir; ele toate se termina prin caracterul nul '\0', cu valoarea 0. De exemplu:
sizeof("asdf")==5;
Tipul unui sir este "vector de un numar corespunzator de caractere", asa ca "asdf" este de tipul char[5]. Sirul vid se scrie "" (si are tipul char[1]). Sa observam ca pentru orice sir s, strlen(s) == sizeof(s) - 1 deoarece strlen() nu numara zeroul terminal.
Conventia backslash pentru reprezentarea caracterelor negrafice pot de asemenea sa fie utilizate intr-un sir: aceasta face posibil sa se reprezinte ghilimelele si insusi caracterul backslash intr-un sir. Cel mai frecvent astfel de caracter este pe de parte caracterul '\n'. De exemplu:
cout << "beep at end of message\007\n";
unde 7 este valoarea ASCII a caracterului bel.
Nu este posibil sa avem un caracter newline "real" intr-un sir:
"this is not a string
but a syntax error"
cu toate acestea, un backslash urmat imediat de un newline poate apare intr-un sir: ambele vor fi ignorate. De exemplu:
cout << "this is\
ok"
va scrie
this is ok
Este posibil ca sa avem caracterul nul intr-un sir, dar majoritatea programelor nu vor suspecta ca dupa el mai sint caractere. De exemplu, sirul "asdf\000hjkl" va fi tratat ca "asdf" prin functii standard cum ar fi strcpy() si strlen().
Cind
se include o
char v1[]="a\x0fah\0129"; // 'a' '\xfa' 'h' '\12' '9'
char v2[]="a\xfah\129"; // 'a' '\xfa' 'h' '\12' '9'
char v3[]="a\xfad\127"; // 'a' '\xfad' '\127'
Sa observam ca o notatie cu doua cifre hexazecimale nu este suficienta pe masini cu 9 biti pe byte.
2.4.5. Zero
Zero
(0) poate fi folosit ca o
Nici un obiect nu este alocat cu adresa zero. Tipul lui zero va fi determinat de context. Toti bitii de o dimensiune potrivita sint zero.
2.4.6. Const
Cuvintul
cheie const poate fi adaugat la declaratia unui obiect pentru a face acel
obiect o
const int model = 145;
const int v[] = ;
Deoarece la un astfel de obiect nu i se poate atribui o valoare, el trebuie sa fie initializat. Declarind ceva ca este constant ne asiguram ca valoarea lui nu va fi schimbata in domeniul lui:
model = 165; // error
model++; // error
Sa
observam ca const modifica un tip; adica el restringe modul in care un obiect
poate fi utilizat, in loc sa specifice cum se aloca
const char* peek(int i)
O functie de aceasta forma ar putea fi utilizata pentru a permite cuiva sa citeasca un sir care nu poate fi alterat.
Cu
toate acestea, un compilator poate avea avantaje de pe urma unui obiect care
este o
Cind utilizam un pointer, sint implicate doua obiecte; pointerul insusi si obiectul spre care se face pointarea.
"Prefixind"
o declaratie a unui pointer cu const se construieste obiectul ca o
const char* pc = "asdf"; // pointer spre o
pc[3] = 'a'; // eroare
pc = "ghjk"; // ok
Pentru
a declara ca pointerul insusi este o
char *const cp = "asdf"; // pointer constant
cp[3] = 'a'; // ok
cp = "ghjk"; // eroare
Pentru a face ca sa fie constante atit obiectele, cit si pointerul spre ele, trebuie ca ambele sa fie declarate ca si constante. De exemplu:
const char *const cpe =
"asdf"; // pointer constant
spre
cpc[3] = 'a'; // eroare
cpc = "ghjk"; // eroare
Un
obiect care este o
char* strcpy(char* p,const char* q);//nu poate modifica pe *q
Se
poate atribui adresa unei variabile la un pointer spre o
int a = 1;
const c = 2;
const* p1 = &c; // ok
const* p2 = &a; // ok
int* p3 = &c; // eroare
*p3 = 7; // schimba valoarea lui
De obicei, daca tipul este omis intr-o declaratie, se alege int ca implicit.
2.4.7. Enumerari
O alta posibilitate pentru a defini constante intregi, care este adesea mai convenabil decit utilizind const, este enumerarea. De exemplu:
enum ;
defineste trei constante intregi, numite enumeratori si atribuie valori la acestia. Deoarece valorile enumerator sint atribuite crescator de la zero, aceasta este echivalent cu scrierea:
const ASM = 0;
const AUTO = 1;
const BREAK = 2;
O enumerare poate fi definita. De exemplu:
enum keyword ;
Numele enumerarii devine un sinonim pentru int, nu un nou tip. De exemplu:
keyword key;
switch(key)
va conduce la un avertisment deoarece numai doua valori au fost tratate din cele trei.
Valorile pot fi de asemenea date explicit enumeratorilor. De exemplu:
enum int16 ;
Aceste valori nu este necesar sa fie distincte, crescatoare sau pozitive.
|