Mi a különbség az int és a statikus int adattípusok között a C-ben?


Legjobb válasz

Ne keverje össze a típust (például int) a deklarációk egyéb vonatkozásaival (pl. egy tárolási osztály, például static).

Vagyis:

int x;

static int y;

x és y típusa azonos, int (a „ data típus” kifejezés a C és a C ++ nyelven ritkábban használják; ez azért nem baj).

A static kulcsszónak három különböző jelentése van C-ben. A fenti példában azt jelzi hogy a y változó „privát” az adott fordítási egységhez (mivel a fordítási egység minden #include irányelv után forrásfájlnak tekinthető feldolgozták). Tehát egy másik fordítási egységben deklarált y változó különbözik ettől.

Íme egy példa a static C-ben:

void f() {

static int n = 2;

...

}

Ez a statikus azt jelenti, hogy a megosztva van a f() összes meghívása között, és a f() visszatérése után is fennáll (lehet, pl. mutasson vissza rá mutatót). A n inicializálása 2 fájlra csak a program indítása előtt történik a C-ben (a első f() meghívásában a C ++ -ban). Tehát a f() második (és későbbi) idő meghívásra kerül, a n megtartja az előbbi értéket (amíg a program ezt kifejezetten módosítja) ).

A harmadik jelentés kevésbé gyakori (és azt hiszem, kevésbé ismert):

void g(double x[static 5]) {

...

}

Ez azt jelzi, hogy g() csak a tömbképzésben lévő legalább 5 double érték első mutatójával hívható meg.

SZERKESZTÉS: A helyi javításának magyarázata statikus inicializálás as (lásd Jesse Pollard megjegyzését).

Válasz

A statikus a dinamika ellentéte. Mi? Ez azt jelenti, hogy az adott változó számára lefoglalt memória nem mozog a memóriában. Ez azt is jelenti, hogy az adott változóhoz hozzáférő függvények ismételt hívásakor a változó új árnyékmásolatai nem jönnek létre; az eredeti változót használják, és bármely más, a változóhoz ezen a címen hozzáférő funkció módosíthatja vagy elolvashatja. Ez önmagában nem globális változó; hatálya ugyanaz marad, mint ahol és hogyan definiálták. Pedig lehet. Hiba lenne azonban megpróbálni meghatározni egy másik, azonos nevű statikus változót ugyanabban a fájlban, vagy pedig egy alkalmazásban.

Fontoljon meg egy egyszerű C add funkciót:

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;

}

a statikus értékek. Ez azt jelenti, hogy a beléjük helyezett értékek több felvételi hívás során is megmaradnak. A számlálást és az utolsó értéket nullára inicializáljuk, de ezután nem nullázzuk újra minden híváskor. Figyelje meg, hogy a számlálás és az last hatóköre csak a add függvényen belül található. Előfordulhat, hogy nem osztják meg más funkciókkal, és nem érhetők el az add hozzáadáson kívül, így ahhoz, hogy hozzájuk férjen, a funkció belsejéből kell kinyomtatnia őket. Más funkcióknak azonos lehet a számlálásuk és az utolsó statikus változataik, és soha nem lépnek kölcsönhatásba.

Most nézze meg ezt a tesztprogramot:

#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;

}

Három statikus változó három halmaza számít és utolsó; mindegyik külön. Először a globálisok vannak, itt soha nem használják őket. Az main saját halmaza van, amelyet azért használ, mert lokális varsai árnyékolják a globálisokat. A add saját halmaza van, amely a fő és a globális elemeket egyaránt azonos árnyékkal látja el.

Statikus függvénydefiníciók egy másfajta dolog. A statikus szó azt jelzi, hogy a függvény csak abban a fájlban látható, amely abból a forrásból van összeállítva, ahol a függvény meg van határozva. Ez vagy a forrás (“.c”) fájl, vagy a fejléc (“.h) fájlt tartalmaz. Erre akkor lehet szükség, ha az Ön által használt objektumfájloknak több, azonos nevű függvény-verziója van (például hozzáadás, nyomtatás, hiba stb.), Így az objektumfájlok kombinálása („. O”) mint modulok együttesen nem okoznak ütközést.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük