Documente online.
Zona de administrare documente. Fisierele tale
Am uitat parola x Creaza cont nou
 HomeExploreaza
upload
Upload




Constante

c


Constante



C++ furnizeaza o notatie pentru valorile de tipuri fundamen­tale: constante caracter, constatante intregi si constante in virgula flotanta. In plus, zero (0) poate fi utilizat ca si o constanta pentru orice tip de pointer, iar sirurile de caractere sint constante de tip char[]. Este posibil, de asemenea, sa se specifice constante simbolice. O constanta simbolica este un nume a carui valoare nu poate fi schimbata in domeniul ei de existen­ta. In C++ exista trei feluri de constante simbolice:

(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 constanta.

2.4.1. Constante intregi

Constantele intregi pot fi de patru feluri: zecimale, oc­tale, 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 constanta care incepe cu zero urmat de x (0x) este hexa­zecimal, iar o constanta care incepe cu zero urmat de o cifra este in octal.

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 constanta in flotanta este de tip double. Din nou compila­torul da un avertisment despre constante flotante care sint prea mari pentru a putea fi reprezentate. Iata citeva constante in virgula flotanta:

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 constanta flotanta ci 4 lexicuri:

65.43 e - 21

si va cauza eroare sintactica.

Daca noi dorim o constanta de tip float, noi putem defini una de forma (&2.4.6):

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 constanta caracter este un caracter inclus intre carac­terele apostrof: de exemplu 'a' si '0'. Astfel de constante caracter sint constante simbolice adevarate pentru valorile intregi ale caracterelor din setul de caractere al masinii pe care se executa programul C++ (care nu este in mod necesar ace­lasi set de caractere ca si cel utilizat de calculatorul pe care se compileaza programul). Astfel, daca noi executam programul pe o masina care utilizeaza setul de caractere ASCII, valoarea '0' este 48; daca masina utilizeaza setul EBCDIC, el este 240. Utili­zind constantele caracter in locul notatiei zecimale programele devin mai portabile. Citeva caractere au de asemenea notatii standard in care se utilizeaza caracterul backslash (\):

'\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 ur­matoare). Utilizind o notatie numerica pentru un caracter, pro­gramul 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 negra­fice pot de asemenea sa fie utilizate intr-un sir: aceasta face posibil sa se reprezinte ghilimelele si insusi caracterul back­slash 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 constanta numerica intr-un sir folosind notatia octala sau hexazecimala, este totdeauna bine sa se utili­zeze trei cifre pentru numar. Notatia este destul de greu de utilizat fara sa apara probleme cind caracterul dupa o constanta de acest fel este o cifra. Consideram exemplele:

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 constanta de tip intreg, flotant sau pointer.

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 constanta in loc de variabila. De exemplu:

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 do­meniul 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 constanta. Este, de exemplu, perfect rezonabil si uneori util sa declaram o functie care returneaza o constanta:

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 constanta in diferite moduri. Cel mai evident este faptul ca de obicei nu este nevoie ca sa fie alocata memorie pentru constanta deoarece compilatorul cunoaste valoarea lui. Mai mult decit atit, initializatorul pentru o constanta este adesea (dar nu totdeauna) o expresie constanta; daca este asa, ea poate fi evaluata la compilare. Cu toate aces­tea, de obicei este necesar sa se aloce memorie pentru un vector de constante deoarece compilatorul nu poate in general sa defi­neasca care elemente ale vectorului sint referite in expresii. Pe multe masini, totusi, o implementare eficienta poate fi atinsa chiar in acest caz plasind vectori de constante in memorii read_only.

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 con­struieste obiectul ca o constanta, nu si pointerul. De exemplu:

const char* pc = "asdf"; // pointer spre o constanta

pc[3] = 'a'; // eroare

pc = "ghjk"; // ok

Pentru a declara ca pointerul insusi este o constanta si nu obiectul spre care pointeaza, se foloseste operatorul *const:

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 constanta

cpc[3] = 'a'; // eroare

cpc = "ghjk"; // eroare

Un obiect care este o constanta cind este accesat printr-un pointer poate fi variabila cind este accesat in alt mod. Aceasta este util mai ales pentru argumentele functiilor. Declarind un pointer_argument ca si const, functiei i se interzice sa modifice obiectul spre care pointeaza pointerul respectiv. De exemplu:

char* strcpy(char* p,const char* q);//nu poate modifica pe *q

Se poate atribui adresa unei variabile la un pointer spre o constanta deoarece nu se intimpla nimic rau prin aceasta. Cu toate acestea, adresa unei constante nu se poate atribui la un pointer fara restrictii deoarece aceasta ar permite sa schimbe valoarea obiectului. De exemplu:

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 enumera­rea. 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.



Document Info


Accesari: 5166
Apreciat: hand-up

Comenteaza documentul:

Nu esti inregistrat
Trebuie sa fii utilizator inregistrat pentru a putea comenta


Creaza cont nou

A fost util?

Daca documentul a fost util si crezi ca merita
sa adaugi un link catre el la tine in site


in pagina web a site-ului tau.




eCoduri.com - coduri postale, contabile, CAEN sau bancare

Politica de confidentialitate | Termenii si conditii de utilizare




Copyright © Contact (SCRIGROUP Int. 2024 )