Beste svaret
Ikke forveksle en type (som int
) med andre aspekter ved erklæringer (f.eks. en lagringsklasse som static
).
Ie, i:
int x;
static int y;
x
og y
har samme type, int
(begrepet « data type» brukes mindre ofte i C og C ++; det er ikke galt skjønt.
Nøkkelordet static
har tre forskjellige betydninger i C. I eksemplet ovenfor indikerer det at variabelen y
er «privat» for den bestemte oversettelsesenheten (som oversettelsesenhet kan tross alt betraktes som en kildefil #include
direktiver har blitt behandlet). Så en variabel y
erklært i en annen oversettelsesenhet er forskjellig fra denne.
Her er et eksempel på den andre betydningen av static
i C:
void f() {
static int n = 2;
...
}
Denne statikken betyr at variabelen n
deles blant alle påkallelsene til f()
og den eksisterer selv etter at f()
returnerer (du kan, returner en peker til den). Initialiseringen av n
til 2
skjer før programstart. i C (på første påkallelse av f()
i C ++). Så den andre (og senere) tiden f()
blir påkalt, vil n
beholde den verdien den hadde før (til programmet eksplisitt endrer det igjen ).
Den tredje betydningen er mindre vanlig (og, tror jeg, mindre kjent):
void g(double x[static 5]) {
...
}
Dette indikerer at g()
kan bare kalles med en peker til den første av minst 5 double
verdier i matrisedannelse.
EDIT: Fast forklaring på lokal statisk initialisering som (se Jesse Pollards kommentar).
Svar
Statisk er det motsatte av dynamikk. Hu h? Det betyr at minnet som er tildelt for den variabelen ikke beveger seg i minnet. Det betyr også at i gjentatte anrop til funksjoner som får tilgang til den variabelen, opprettes ikke nye skyggekopier av variabelen; den opprinnelige variabelen brukes, og enhver annen funksjon som får tilgang til den variabelen på den adressen, kan endre eller lese den. Det er ikke i seg selv en global variabel; omfanget forblir det samme som hvor og hvordan det ble definert. Det kan imidlertid være. Det ville være en feil å prøve å definere en annen statisk variabel med samme navn i samme fil eller en som er inkludert i et program.
vurdere en enkel C add-funksjon:
int add(int a, int b)
{
static int count = 0;
static int last = 0;
count++;
last = a + b;
printf( "a:\t\%d \t\t b:\t\%d\n", a, b );
printf( "count:\t\%d \t\t last:\t\%d\n", count, last)
return last;
}
antall og siste er definert statisk. Det betyr at verdiene som legges inn i dem vedvarer over flere samtaler for å legge til. antall og siste initialiseres til null, men nullstilles ikke på nytt ved hver samtale. Legg merke til at omfanget av antall og siste er innenfor funksjonen bare legg til. De kan ikke deles med andre funksjoner eller være tilgjengelige utenfor tillegg, så for å komme til dem må du skrive dem ut fra funksjonen. Andre funksjoner kan ha samme antall og siste statiske vars også, og de vil aldri samhandle.
Se nå på dette testprogrammet:
#include
static int count = 5;
static int last = 0;
int add(int a, int b)
{
static int count = 0;
static int last = 0;
count++;
last = a + b;
printf( "a:\t\%d \t\t b:\t\%d\n", a, b );
printf( "count:\t\%d \t\t last:\t\%d\n", count, last)
return last;
}
int main(int argc, char**argv )
{
static int count = 10;
static int last = 0;
int i;
int a=1, b=1;
for(i = 0 ; i < count ; i++)
{
a = add(a, b);
b = add(a, last);
last = add(a, b);
}
printf( "a:\t\%d \t\t b:\t\%d\n", a, b );
printf( "count:\t\%d \t\t last:\t\%d\n", count, last);
return 0;
}
Tre er 3 sett med statiske variabler teller og varer; alle er separate. Først er de globale, de blir aldri brukt her. main
har sitt eget sett som den bruker fordi dets lokale vars skygger globaler. add
har sitt eget sett som skygger både hoved- og globaler med samme navn.
Definisjoner av statiske funksjoner er en annen type ting. Ordet statisk indikerer at funksjonen bare er synlig i filen som er kompilert fra kilden der funksjonen er definert. Dette er enten kildefilen (“.c”) eller en overskrift (“.h) fil inkludert i den. Dette kan være nødvendig hvis objektfilene du bruker har mer enn én versjon av en funksjon med samme navn (som legge til, skrive ut, feil, ...) slik at kombinasjon av objektfiler (". O") sammen som moduler forårsaker ikke navngivningskollisjoner.