Kvalifikationen konst kan anvendes på erklæringen af enhver variabel for at angive, at dens værdi ikke vil blive ændret (hvilket afhænger af, hvor const-variabler er gemt, vi kan ændre værdien af const-variablen ved at bruge en markør). Resultatet er implementeringsdefineret, hvis der gøres forsøg på at ændre en konst.
At bruge const-kvalifikationen i C er en god praksis, når vi vil sikre, at nogle værdier skal forblive konstante og ikke må ændres ved et uheld.
test og typer af test
I C-programmering kan const-kvalifikationen bruges i forskellige sammenhænge til at give forskellige adfærd. Her er nogle forskellige anvendelsestilfælde af const-kvalifikationen i C:
1. Konstante variable
const int var = 100;>
I dette tilfælde bruges const til at erklære en variabel var som en konstant med en startværdi på 100. Værdien af denne variabel kan ikke ændres, når den først er initialiseret. Se følgende eksempel:
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;> }> |
>
>
Produktion
./Solution.cpp: In function 'int main()': ./Solution.cpp:11:9: error: assignment of read-only variable 'var' var = 200; ^>
2. Markør til konstant
const int* ptr;>
ELLER
int const *ptr;>
Vi kan ændre markøren til at pege på en hvilken som helst anden heltalsvariabel, men kan ikke ændre værdien af objektet (entiteten), der peger ved hjælp af pointer ptr. Markøren gemmes i læse-skriveområdet (stak i dette tilfælde). Det pegede objekt kan være i skrivebeskyttet eller læse-skriveområdet. Lad os se følgende eksempler.
Eksempel 1:
C
selen tutorial
// 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;> }> |
>
>
Produktion
./Solution.c: In function 'main': ./Solution.c:12:10: error: assignment of read-only location '*ptr' *ptr = 100; ^>
Eksempel 2: Program hvor variabel i selv er konstant.
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;> }> |
>
hvor mange byer er der i USA
>
Produktion
./Solution.c: In function 'main': ./Solution.c:18:10: error: assignment of read-only location '*ptr' *ptr = 100; ^>
Nedkvalifikation er ikke tilladt i C++ og kan forårsage advarsler i C. Nedkvalifikation refererer til den situation, hvor en kvalificeret type er tildelt en ikke-kvalificeret type.
Eksempel 3: Program til at vise ned kvalifikation.
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;> }> |
>
>
substring_index i sql
Produktion
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. Konstant markør til variabel
int* const ptr;>
Ovenstående erklæring er en konstant pointer til en heltalsvariabel, hvilket betyder, at vi kan ændre værdien af objektet, der peges af markøren, men kan ikke ændre markøren til at pege på en anden variabel.
Eksempel
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;> }> |
>
>
Produktion
./Solution.c: In function 'main': ./Solution.c:15:9: error: assignment of read-only variable 'ptr' ptr = &j; /* error */ ^>
4. Konstant markør til konstant
const int* const ptr;>
Ovenstående erklæring er en konstant pointer til en konstant variabel, hvilket betyder, at vi ikke kan ændre værdien, der peges af pointeren, ligesom vi ikke kan pege markøren til andre variabler. Lad os se med et eksempel.
C
java anonym funktion
// 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;> }> |
>
>
Produktion
./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 */ ^>
Fordele ved const Qualifiers i C
Const-kvalifikationen i C har følgende fordele:
- Forbedret kodelæsbarhed: Ved at markere en variabel som const, indikerer du over for andre programmører, at dens værdi ikke bør ændres, hvilket gør din kode lettere at forstå og vedligeholde. Forbedret typesikkerhed: Ved at bruge const kan du sikre, at værdier ikke ved et uheld ændres, hvilket reducerer chancen for fejl og fejl i din kode. Forbedret optimering: Compilere kan optimere const-variabler mere effektivt, da de ved, at deres værdier ikke ændres under programafvikling. Dette kan resultere i hurtigere og mere effektiv kode. Bedre hukommelsesbrug: Ved at erklære variabler som const, kan du ofte undgå at skulle lave en kopi af deres værdier, hvilket kan reducere hukommelsesforbruget og forbedre ydeevnen. Forbedret kompatibilitet: Ved at erklære variabler som const, kan du gøre din kode mere kompatibel med andre biblioteker og API'er, der bruger const-variabler. Forbedret pålidelighed: Ved at bruge const kan du gøre din kode mere pålidelig, da du kan sikre, at værdier ikke ændres uventet, hvilket reducerer risikoen for fejl og fejl i din kode.
Resumé
Type | Erklæring | Pointerværdiændring (*ptr = 100) | Pointing Value Change (ptr = &a) |
---|---|---|---|
Pointer til Variabel | int * ptr | Ja | Ja |
Pointer til konstant | const int * ptr int const * ptr | Ingen | Ja |
Konstant pointer til variabel | int * const ptr | Ja | Ingen |
Konstant pointer til konstant | const int * const ptr | Ingen | Ingen |
Denne artikel er udarbejdet af Narendra Kangralkar .