Mis vahe on staatilisel muutujal ja globaalsel muutujal C / C ++?


Vastus 1:

C muutujate ulatus

Kohalikud muutujad

Kui muutuja deklareeritakse funktsiooniplokis nagu allpool:

# kaasata 
tühine test ()
{
    / * funktsiooni testi kohalik muutuja * /
    int x = 10;
    printf ("% d \ n", x);
}
int main ()
{
    / * funktsiooni pea lokaalne muutuja * /
    int x = 100;
    {
        / * selle ploki kohalik muutuja * /
        int x = 1;
        printf ("% d \ n", x);
    }
    printf ("% d \ n", x);
    test ();
}

Väljund:

Siis pääseb muutuja juurde ainult funktsiooniplokis, sel juhul on muutuja lokaalne muutuja ja sellised muutujad omavad lokaalset ulatust.

Samamoodi nagu ülaltoodud näidiskoodis, on muutuja „x” väärtus koodiplokis ({}) 1 määratletud funktsiooni „pea” sees ja selle muutuja „x” väärtus funktsioonis „pea” väljaspool seda koodiplokk ({}) on 100. Funktsiooni 'test' muutuja 'x' väärtus on 10.

Globaalsed muutujad

Neid muutujaid, mis on määratletud väljaspool kõiki funktsioone, nimetatakse globaalseks muutujaks. Pärast deklareerimist pääseb neile muutujatele juurde selle programmi mis tahes funktsioonidega. Seega väidetakse, et sellistel muutujatel on globaalne ulatus. Kui näeme allolevat koodi:

# kaasata 
/ * Globaalne muutuja * /
int x = 1000;
tühine test2 ()
{
    / * samanimeline kohalik muutuja * /
    int x = 100;
    printf ("% d \ n", x);
}

int main ()
{
    printf ("% d \ n", x);
    test2 ();
}

Väljund:

Siin näete, et funktsioonis 'test2' anti prioriteediks kohaliku muutuja 'x' väärtus globaalse muutujaga võrreldes sama nimega 'x'.

See selleks.


Vastus 2:

Kui funktsiooni kutsutakse mitu korda või luuakse funktsiooni kutsumiseks objekte, säilib staatiliseks tunnistatud identifikaator väärtus, mida viimati värskendati selle funktsiooni viimase funktsioonikõne ajal.

See tähendab, et kui muutuja kuulutatakse funktsioonis staatiliseks, siis objektikõnede ajal või lihtsalt mitme kõne korral, kuigi igale muutujale antakse iga funktsioonikõne ajal ruumi ja eraldi mälu, kuid staatiliseks kuulutatud muutujatele ei eraldata iga funktsioonikõne ajal eraldi mälujaotust .

Fikseeritud mälu eraldatakse ja iga kord funktsioonikõne ajal, kui staatilisse muutujasse tehakse muudatusi, tehakse see samas mälu asukohas või sama muutujaga, seetõttu jäävad funktsioonikõne ajal staatilise muutujaga tehtud muudatused muutumatuks järgmise funktsioonikõne ajal. ja seega nimi staatiline.

Globaalseid muutujaid ei saa ülaltoodud funktsiooni sees kuulutada. Globaalsed muutujad on saadaval kõikidele funktsioonidele, kuna iga funktsioon saab sellele juurde pääseda, kuid vaikimisi on globaalsed muutujad staatilised, see tähendab, et kõik muutused on muutuja sees olemas.

Staatilisi saab kuulutada ka globaalselt.

Kuid globaalse muutuja ja staatilise globaalse muutuja erinevust globaalsetest muutujatest saavad teised failid kasutada, kuid staatilist globaalset muutujat saab kasutada ainult selles failis, kus see on deklareeritud.


Vastus 3:

Funktsiooni või ploki sees deklareeritud muutujad, mida nimetatakse kohalikuks muutujaks. Muutujad, mis on deklareeritud väljaspool funktsiooni, mida nimetatakse globaalseks muutujaks.

# kaasata 
int a = 1; // globaalne muutuja
tühi kuva ()
{
   int b = 2; // kuvafunktsiooni kohalik muutuja
   printf ("b =% d \ n", b);
}
int main ()
{
      int c = 3; // põhifunktsiooni lokaalne muutuja
      staatiline int d = 4; // põhifunktsiooni lokaalne muutuja
      printf ("a =% d \ n", a);
      kuva ();
      printf ("c =% d \ n", c);
      printf ("d =% d \ n", d);
      {
        int e = 5; // ainult selle ploki kohalik muutuja
        printf ("e =% d \ n", e);
      }
      tagasi 0;
}

Väljund: -a = 1b = 2c = 3d = 4e = 5

Storage klassi täpsustajates deklareeritakse muutuja,

auto: - ainult kohalik muutuja

register: - ainult kohalik muutuja

staatiline: - nii kohalik kui ka globaalne muutuja

väline: - ainult globaalne muutuja

Muutujate ulatus

C-klassi hoiuklassid


Vastus 4:
6.2.2 Identifikaatorite lingid 1) Kui objekti või funktsiooni faili ulatuse identifikaatori deklaratsioon sisaldab mäluklassi spetsifikaati staatiliselt, on identifikaatoril sisemine seos. 2) Kui funktsiooni identifikaatori deklaratsioonil pole mäluklassi täpsustust, siis määratakse selle seotus täpselt nii, nagu oleks see deklareeritud välismäluklassi täpsustajaga. Kui objekti identifikaatori deklaratsioonil on faili ulatus ja mäluklassi täpsustust pole, on selle seotus väline.

 sisemine seotus

väline seotus


Vastus 5:
6.2.2 Identifikaatorite lingid 1) Kui objekti või funktsiooni faili ulatuse identifikaatori deklaratsioon sisaldab mäluklassi spetsifikaati staatiliselt, on identifikaatoril sisemine seos. 2) Kui funktsiooni identifikaatori deklaratsioonil pole mäluklassi täpsustust, siis määratakse selle seotus täpselt nii, nagu oleks see deklareeritud välismäluklassi täpsustajaga. Kui objekti identifikaatori deklaratsioonil on faili ulatus ja mäluklassi täpsustust pole, on selle seotus väline.

 sisemine seotus

väline seotus


Vastus 6:
6.2.2 Identifikaatorite lingid 1) Kui objekti või funktsiooni faili ulatuse identifikaatori deklaratsioon sisaldab mäluklassi spetsifikaati staatiliselt, on identifikaatoril sisemine seos. 2) Kui funktsiooni identifikaatori deklaratsioonil pole mäluklassi täpsustust, siis määratakse selle seotus täpselt nii, nagu oleks see deklareeritud välismäluklassi täpsustajaga. Kui objekti identifikaatori deklaratsioonil on faili ulatus ja mäluklassi täpsustust pole, on selle seotus väline.

 sisemine seotus

väline seotus


Vastus 7:
6.2.2 Identifikaatorite lingid 1) Kui objekti või funktsiooni faili ulatuse identifikaatori deklaratsioon sisaldab mäluklassi spetsifikaati staatiliselt, on identifikaatoril sisemine seos. 2) Kui funktsiooni identifikaatori deklaratsioonil pole mäluklassi täpsustust, siis määratakse selle seotus täpselt nii, nagu oleks see deklareeritud välismäluklassi täpsustajaga. Kui objekti identifikaatori deklaratsioonil on faili ulatus ja mäluklassi täpsustust pole, on selle seotus väline.

 sisemine seotus

väline seotus


Vastus 8:
6.2.2 Identifikaatorite lingid 1) Kui objekti või funktsiooni faili ulatuse identifikaatori deklaratsioon sisaldab mäluklassi spetsifikaati staatiliselt, on identifikaatoril sisemine seos. 2) Kui funktsiooni identifikaatori deklaratsioonil pole mäluklassi täpsustust, siis määratakse selle seotus täpselt nii, nagu oleks see deklareeritud välismäluklassi täpsustajaga. Kui objekti identifikaatori deklaratsioonil on faili ulatus ja mäluklassi täpsustust pole, on selle seotus väline.

 sisemine seotus

väline seotus


Vastus 9:
6.2.2 Identifikaatorite lingid 1) Kui objekti või funktsiooni faili ulatuse identifikaatori deklaratsioon sisaldab mäluklassi spetsifikaati staatiliselt, on identifikaatoril sisemine seos. 2) Kui funktsiooni identifikaatori deklaratsioonil pole mäluklassi täpsustust, siis määratakse selle seotus täpselt nii, nagu oleks see deklareeritud välismäluklassi täpsustajaga. Kui objekti identifikaatori deklaratsioonil on faili ulatus ja mäluklassi täpsustust pole, on selle seotus väline.

 sisemine seotus

väline seotus