Paras vastaus
Älä sekoita tyyppiä (kuten int
) muiden ilmoitusten näkökohtien kanssa (esim. tallennusluokka, kuten static
).
Eli, sisään:
int x;
static int y;
x
ja y
tyyppi on sama, int
(termi ” data type” käytetään harvemmin C: ssä ja C ++: ssa; se ei kuitenkaan ole väärin).
Avainsanalla static
on C: ssä kolme erilaista merkitystä. Yllä olevassa esimerkissä se osoittaa että muuttuja y
on ”yksityinen” kyseiselle käännösyksikölle (koska käännösyksikkö voidaan ajatella lähdetiedostona kaikkien #include
-direktiivien jälkeen käsitelty). Joten toisessa käännösyksikössä ilmoitettu muuttuja y
on erilainen kuin tämä.
Tässä on esimerkki static
C: ssä:
void f() {
static int n = 2;
...
}
Tämä staattinen tarkoittaa, että muuttuja n
jaetaan kaikkien f()
-kutsujen kesken ja se pysyy olemassa myös sen jälkeen, kun f()
palaa (voit palauta osoitin siihen). n
-alustus alustetaan 2
-ohjelmaan vain ennen ohjelman käynnistämistä C: ssä ( ensimmäisessä f()
-kutsussa C ++: ssa). Joten toinen (ja myöhempi) aika f()
kutsutaan, n
säilyttää aikaisemman arvonsa (kunnes ohjelma nimenomaisesti muuttaa sitä uudelleen ).
Kolmas merkitys on harvinaisempi (ja mielestäni vähemmän tunnettu):
void g(double x[static 5]) {
...
}
Tämä tarkoittaa, että g()
voidaan kutsua vain osoittimella ensimmäiseen vähintään viidestä double
arvosta taulukon muodostuksessa.
MUOKKAA: Paikallisen paikan kiinteä selitys staattinen alustus muodossa (katso Jesse Pollardin kommentti).
Vastaus
Staattinen on dynaamisen vastakohta. Huh? Se tarkoittaa, että tälle muuttujalle varattu muisti ei liiku muistissa. Se tarkoittaa myös, että toistuvissa kutsuissa toimintoihin, jotka käyttävät kyseistä muuttujaa, muuttujan uusia varjo kopioita ei luoda. alkuperäistä muuttujaa käytetään, ja kaikki muut toiminnot, jotka käyttävät kyseistä muuttujaa kyseisessä osoitteessa, voivat muokata tai lukea sitä. Se ei sinänsä ole globaali muuttuja; sen soveltamisala pysyy samana kuin missä ja miten se määritettiin. Se voi kuitenkin olla. Olisi kuitenkin virhe yrittää määritellä toinen staattinen muuttuja samannimiseen samaan tiedostoon tai yksi sovellukseen.
Harkitse yksinkertaista C-lisätoimintoa:
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;
}
määrä ja viimeinen määritetään staattisina. Tämä tarkoittaa, että niihin asetetut arvot jatkuvat useiden lisättävien puheluiden aikana. laskenta ja viimeinen alustetaan nollaan, mutta niitä ei sitten nollata uudelleen jokaisen puhelun yhteydessä. Huomaa, että laskenta ja viimeinen ovat vain lisäystoiminnon sisällä. Niitä ei välttämättä jaeta muiden toimintojen kanssa, eikä niitä voi käyttää lisäyksen ulkopuolella, joten päästäksesi niihin sinun on tulostettava ne toiminnon sisältä. Muilla toiminnoilla voi olla sama lukumäärä ja viimeiset staattiset variat, eivätkä ne ole koskaan vuorovaikutuksessa.
Katso nyt tätä testiohjelmaa:
#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;
}
Kolme on 3 staattisten muuttujien sarjaa ja viimeinen; ne kaikki ovat erillisiä. Ensinnäkin ovat globaalit, niitä ei koskaan käytetä täällä. main
on oma joukko, jota se käyttää, koska sen paikalliset muuttujat varjostavat globaaleja. add
on oma joukko, joka varjostaa sekä pää- että globaalit samalla nimellä.
Staattiset funktiomääritelmät ovat erilainen asia. Sana staattinen osoittaa, että funktio näkyy vain tiedostossa, joka on koottu lähteestä, jossa funktio on määritelty. Tämä on joko lähde (“.c”) tai otsikko (".h) tiedosto. Tämä voi olla tarpeen, jos käyttämilläsi objektitiedostoilla on useampi kuin yksi versio toiminnosta, jolla on sama nimi (kuten add, print, error jne.), Jotta objektitiedostojen yhdistäminen (“. O”) moduuleina ei aiheuta törmäyksiä.