Staattisilla muuttujilla on ominaisuus säilyttää arvonsa myös sen jälkeen, kun ne ovat soveltamisalansa ulkopuolella! Näin ollen staattinen muuttuja säilyttää aikaisemman arvonsa aiemmassa laajuudessaan eikä sitä alusta uudelleen uudessa laajuudessa.
Syntaksi:
static data_type var_name = var_value;>
Seuraavassa on mielenkiintoisia faktoja C:n staattisista muuttujista:
java säikeen luominen
1) Staattinen int-muuttuja jää muistiin ohjelman ollessa käynnissä. Normaali tai automaattinen muuttuja tuhoutuu, kun funktiokutsu, jossa muuttuja on ilmoitettu, on ohi.
Voimme esimerkiksi käyttää static int:tä laskeaksemme, kuinka monta kertaa funktiota kutsutaan, mutta auto-muuttujaa ei voi käyttää tähän tarkoitukseen.
Esimerkki
C
// C Program to illustrate the static variable lifetime> #include> // function with static variable> int> fun()> {> >static> int> count = 0;> >count++;> >return> count;> }> int> main()> {> >printf>(>'%d '>, fun());> >printf>(>'%d '>, fun());> >return> 0;> }> |
>
>Lähtö
1 2>
Yllä oleva ohjelma tulostaa 1 2, koska staattiset muuttujat alustetaan vain kerran ja ovat voimassa ohjelman loppuun asti. Siksi ne voivat säilyttää arvonsa useiden toimintokutsujen välillä.
Kokeillaan samaa koodia paikalliselle automaattiselle muuttujalle.
Esimerkki
java system.out.println
C
// C Program to illustrate local auto variable in comparison> // of static variable.> #include> // Function> int> fun()> {> >int> count = 0;> >count++;> >return> count;> }> // Driver Code> int> main()> {> >printf>(>'%d '>, fun());> >printf>(>'%d '>, fun());> >return> 0;> }> |
kasa ja kasa lajitella
>
>Lähtö
1 1>
2) Staattisille muuttujille on varattu muistia datasegmentissä, ei pinosegmentissä. Katso C-ohjelmien muistiasettelu yksityiskohtia varten.
3) Staattiset muuttujat (kuten globaalit muuttujat) alustetaan 0:ksi, jos niitä ei ole alustettu eksplisiittisesti. Esimerkiksi alla olevassa ohjelmassa x:n arvo on 0, kun taas y:n arvo on jotain roskaa. Katso Tämä Lisätietoja.
Esimerkki
C
// C program to illustrate the default value of static> // variables> #include> int> main()> {> >static> int> x;> >int> y;> >printf>(>'%d
%d'>, x, y);> }> |
>
>
Lähtö
0 [some_garbage_value]>
4) C:ssä staattiset muuttujat voidaan alustaa vain vakioliteraaaleilla. Esimerkiksi seuraava ohjelma epäonnistuu käännöksessä. Katso Tämä Lisätietoja.
Esimerkki
C
mitä on vienti Linuxissa
vuosineljänneksen liiketoiminnassa
#include> int> initializer(>void>)> {> >return> 50;> }> > int> main()> {> >static> int> i = initializer();> >printf>(>' value of i = %d'>, i);> >getchar>();> >return> 0;> }> |
>
>
Lähtö
In function 'main': 9:5: error: initializer element is not constant static int i = initializer(); ^>
Huomautus: Huomaa, että tämä ehto ei päde C++:ssa. Joten jos tallennat ohjelman C++-ohjelmana, se kääntäisi ja toimisi hyvin.
5) Staattiset globaalit muuttujat ja funktiot ovat myös mahdollisia C/C++:ssa. Näiden tarkoitus on rajoittaa muuttujan tai funktion laajuus tiedostoon. Katso Staattiset funktiot C:ssä Lisätietoja.
6) Staattisia muuttujia ei tule ilmoittaa rakenteen sisällä. Syynä on se, että C-kääntäjä edellyttää, että kaikki rakenneelementit on sijoitettava yhteen (eli rakenteen jäsenten muistin varauksen tulisi olla vierekkäistä). On mahdollista ilmoittaa rakenne funktion sisällä (pinosegmentti) tai varata muistia dynaamisesti (kasosegmentti) tai se voi olla jopa globaali (BSS tai datasegmentti). Oli tilanne mikä tahansa, kaikkien rakenteen jäsenten tulisi sijaita samassa muistisegmentissä, koska rakenneelementin arvo haetaan laskemalla elementin siirtymä rakenteen aloitusosoitteesta. Yksin jäsenen erottaminen datasegmentistä kumoaa rakenteen tarkoituksen ja on mahdollista saada koko rakenne staattisena.
Aiheeseen liittyvät artikkelit:
- Staattinen avainsana C++:ssa
- Staattisen avainsanan tietokilpailu
- Staattiset datajäsenet C++:ssa
- Milloin staattiset esineet tuhoutuvat?
- Mielenkiintoisia faktoja staattisista jäsenfunktioista
- Voivatko staattiset funktiot olla virtuaalisia?
- Staattisten avainsanojen vertailu C++:ssa ja Javassa
- Staattiset funktiot C:ssä