logo

Const Qualifier v C

Kvalifikator konst lahko uporabimo za deklaracijo katere koli spremenljivke, da določimo, da njena vrednost ne bo spremenjena (kar je odvisno od tega, kje so shranjene spremenljivke const, lahko spremenimo vrednost spremenljivke const z uporabo kazalca). Rezultat je implementacijsko definiran, če se poskusi spremeniti const.

Uporaba kvalifikatorja const v C je dobra praksa, ko želimo zagotoviti, da nekatere vrednosti ostanejo nespremenjene in se ne smejo pomotoma spremeniti.



okvir tkinter

V programiranju C se lahko kvalifikator const uporablja v različnih kontekstih za zagotavljanje različnih vedenj. Tukaj je nekaj različnih primerov uporabe kvalifikatorja const v C:

1. Konstantne spremenljivke

const int var = 100;>

V tem primeru se za deklaracijo spremenljivke uporablja const je bil kot konstanta z začetno vrednostjo 100. Vrednosti te spremenljivke ni mogoče spremeniti, ko je inicializirana. Oglejte si naslednji primer:

C








// C program to demonstrate that constant variables can not> // be modified> #include> int> main()> {> >const> int> var = 100;> >// Compilation error: assignment of read-only variable> >// 'var'> >var = 200;> >return> 0;> }>

>

>

Izhod

./Solution.cpp: In function 'int main()': ./Solution.cpp:11:9: error: assignment of read-only variable 'var' var = 200; ^>

2. Kazalec na konstanto

const int* ptr;>

ALI

int const *ptr;>

Kazalec lahko spremenimo tako, da kaže na katero koli drugo celoštevilsko spremenljivko, ne moremo pa spremeniti vrednosti predmeta (entitete), na katerega kaže kazalec ptr. Kazalec je shranjen v območju za branje in pisanje (v tem primeru sklad). Kazani predmet je lahko v območju samo za branje ali branje in pisanje. Poglejmo si naslednje primere.

Primer 1:

C


vadnica za selen



// C program to demonstrate that the pointer to point to> // any other integer variable, but the value of the object> // (entity) pointed can not be changed> #include> int> main(>void>)> {> >int> i = 10;> >int> j = 20;> >/* ptr is pointer to constant */> >const> int>* ptr = &i;> >printf>(>'ptr: %d '>, *ptr);> >/* error: object pointed cannot be modified> >using the pointer ptr */> >*ptr = 100;> >ptr = &j;>/* valid */> >printf>(>'ptr: %d '>, *ptr);> >return> 0;> }>

>

>

Izhod

./Solution.c: In function 'main': ./Solution.c:12:10: error: assignment of read-only location '*ptr' *ptr = 100; ^>

Primer 2: Program, kjer je spremenljivka i konstantna.

C




// C program to demonstrate that the pointer to point to> // any other integer variable, but the value of the object> // (entity) pointed can not be changed> #include> int> main(>void>)> {> >/* i is stored in read only area*/> >int> const> i = 10;> >int> j = 20;> >/* pointer to integer constant. Here i> >is of type 'const int', and &i is of> >type 'const int *'. And p is of type> >'const int', types are matching no issue */> >int> const>* ptr = &i;> >printf>(>'ptr: %d '>, *ptr);> >/* error */> >*ptr = 100;> >/* valid. We call it up qualification. In> >C/C++, the type of 'int *' is allowed to up> >qualify to the type 'const int *'. The type of> >&j is 'int *' and is implicitly up qualified by> >the compiler to 'const int *' */> >ptr = &j;> >printf>(>'ptr: %d '>, *ptr);> >return> 0;> }>

>

niz v logično javo

>

Izhod

./Solution.c: In function 'main': ./Solution.c:18:10: error: assignment of read-only location '*ptr' *ptr = 100; ^>

Nizka kvalifikacija ni dovoljeno v C++ in lahko povzroči opozorila v C. Nizka kvalifikacija se nanaša na situacijo, ko je kvalificiran tip dodeljen nekvalificiranemu tipu.

Primer 3: Program za prikaz kvalifikacij.

C




// C program to demonstrate the down qualification> #include> int> main(>void>)> {> >int> i = 10;> >int> const> j = 20;> >/* ptr is pointing an integer object */> >int>* ptr = &i;> >printf>(>'*ptr: %d '>, *ptr);> >/* The below assignment is invalid in C++, results in> >error In C, the compiler *may* throw a warning, but> >casting is implicitly allowed */> >ptr = &j;> >/* In C++, it is called 'down qualification'. The type> >of expression &j is 'const int *' and the type of ptr> >is 'int *'. The assignment 'ptr = &j' causes to> >implicitly remove const-ness from the expression &j.> >C++ being more type restrictive, will not allow> >implicit down qualification. However, C++ allows> >implicit up qualification. The reason being, const> >qualified identifiers are bound to be placed in> >read-only memory (but not always). If C++ allows> >above kind of assignment (ptr = &j), we can use 'ptr'> >to modify value of j which is in read-only memory.> >The consequences are implementation dependent, the> >program may fail> >at runtime. So strict type checking helps clean code.> >*/> >printf>(>'*ptr: %d '>, *ptr);> >return> 0;> }>

>

>

java podniz vsebuje

Izhod

main.c: In function ‘main’: main.c:16:9: warning: assignment discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers] 16 | ptr = &j; | ^ *ptr: 10 *ptr: 20>

3. Kazalec konstante na spremenljivko

int* const ptr;>

Zgornja deklaracija je stalni kazalec na celoštevilsko spremenljivko, kar pomeni, da lahko spremenimo vrednost predmeta, na katerega kaže kazalec, ne moremo pa spremeniti kazalca, da bi kazal na drugo spremenljivko.

Primer

C




// C program to demonstrate that the value of object pointed> // by pointer can be changed but the pointer can not point> // to another variable> #include> int> main(>void>)> {> >int> i = 10;> >int> j = 20;> >/* constant pointer to integer */> >int>*>const> ptr = &i;> >printf>(>'ptr: %d '>, *ptr);> >*ptr = 100;>/* valid */> >printf>(>'ptr: %d '>, *ptr);> >ptr = &j;>/* error */> >return> 0;> }>

>

>

Izhod

./Solution.c: In function 'main': ./Solution.c:15:9: error: assignment of read-only variable 'ptr' ptr = &j; /* error */ ^>

4. Kazalec konstante na konstanto

const int* const ptr;>

Zgornja deklaracija je stalni kazalec na konstantno spremenljivko, kar pomeni, da ne moremo spremeniti vrednosti, na katero kaže kazalec, prav tako pa ne moremo pokazati kazalca na druge spremenljivke. Poglejmo s primerom.

C




preprost program python

// C program to demonstrate that value pointed by the> // pointer can not be changed as well as we cannot point the> // pointer to other variables> #include> int> main(>void>)> {> >int> i = 10;> >int> j = 20;> >/* constant pointer to constant integer */> >const> int>*>const> ptr = &i;> >printf>(>'ptr: %d '>, *ptr);> >ptr = &j;>/* error */> >*ptr = 100;>/* error */> >return> 0;> }>

>

>

Izhod

./Solution.c: In function 'main': ./Solution.c:12:9: error: assignment of read-only variable 'ptr' ptr = &j; /* error */ ^ ./Solution.c:13:10: error: assignment of read-only location '*ptr' *ptr = 100; /* error */ ^>

Prednosti const Qualifiers v C

Kvalifikator const v C ima naslednje prednosti:

    Izboljšana berljivost kode: Če spremenljivko označite kot const, nakažete drugim programerjem, da njene vrednosti ne bi smeli spreminjati, zaradi česar je vaša koda lažja za razumevanje in vzdrževanje. Izboljšana varnost tipov: z uporabo const lahko zagotovite, da vrednosti niso pomotoma spremenjene, kar zmanjša možnost hroščev in napak v vaši kodi. Izboljšana optimizacija: prevajalniki lahko učinkoviteje optimizirajo spremenljivke const, saj vedo, da se njihove vrednosti med izvajanjem programa ne bodo spremenile. To lahko povzroči hitrejšo in učinkovitejšo kodo. Boljša uporaba pomnilnika: Če spremenljivke deklarirate kot const, se lahko pogosto izognete izdelavi kopije njihovih vrednosti, kar lahko zmanjša porabo pomnilnika in izboljša zmogljivost. Izboljšana združljivost: Če spremenljivke deklarirate kot const, lahko svojo kodo naredite bolj združljivo z drugimi knjižnicami in API-ji, ki uporabljajo spremenljivke const. Izboljšana zanesljivost : Z uporabo const lahko naredite svojo kodo bolj zanesljivo, saj lahko zagotovite, da vrednosti niso nepričakovano spremenjene, kar zmanjša tveganje za hrošče in napake v vaši kodi.

Povzetek

Vrsta Izjava Sprememba vrednosti kazalca
(*ptr = 100)
Sprememba kazalne vrednosti
(ptr = &a)
Kazalec na spremenljivko int * ptr ja ja
Kazalec na konstanto const int * ptr
int const * ptr
št ja
Konstantni kazalec na spremenljivko int * const ptr ja št
Kazalec konstante na konstanto const int * const ptr št št

Ta članek je sestavil Narendra Kangralkar .