Junior
Millal ja kui kaua eksisteerivad globaalsed ja kohalikud muutujad C++-is?
sobes.tech AI
Vastus AI-lt
Ülemaailmsed muutujad
- Eluiga: Alates programmi käivitamisest kuni selle lõpetamiseni.
- Salvestuskoht: Tavaliselt staatilises mälualas (.data või .bss sektsioonis täidetava faili).
- Initsialiseerimine:
- Mitte-staatilistele ülemaailmsetele muutujatele, mis on määratletud failitasandil, ja millel on mitte-triviaalne konstruktor, tehakse initsialiseerimine enne
main()kutsumist. - Null-initsialiseeritud ülemaailmsed muutujad (näiteks, int i = 0;) tehakse samuti enne
main(). - Muutujad, mis on määratletud
const-iga või millel on staatiline eluea aeg, initsialiseeritakse programmi laadimisel.
- Mitte-staatilistele ülemaailmsetele muutujatele, mis on määratletud failitasandil, ja millel on mitte-triviaalne konstruktor, tehakse initsialiseerimine enne
- Ligipääsetavus: nähtavad kõigis funktsioonides, kus nende ulatus on.
Kohalikud muutujad
- Eluiga: muutujat määratletud koodiploki (funktsiooni, tsükli, tingimuslause jms) sees kuni selle ploki väljumiseni.
- Salvestuskoht: tavaliselt virnas (automaatsete muutujate jaoks). Staatilised kohalikud muutujad salvestatakse staatilisse mälualasse.
- Initsialiseerimine:
- Automaatseid kohalikke muutujaid ei initsialiseerita vaikimisi (nad sisaldavad "prügi"). Vajavad selget initsialiseerimist.
- Staatilised kohalikud muutujad initsialiseeritakse üks kord, kui neid esmakordselt saavutatakse.
- Ligipääsetavus: nähtavad ainult selles koodilõigus, kus need on määratletud.
Näited
// Ülemaailmne muutuja
int global_variable = 10;
void some_function() {
// Kohalik muutuja (automaatne)
int local_variable_1; // Mitte-initsialiseeritud
// Kohalik muutuja (automaatne) initsialiseerimisega
int local_variable_2 = 20;
// Staatiline kohalik muutuja
static int static_local_variable = 30; // Initsialiseerub üks kord
// Ligipääs ülemaailmsele muutujale
global_variable++;
// Ligipääs kohalikele muutujatele
local_variable_1 = global_variable;
static_local_variable++;
// Pärast some_function() väljumist, local_variable_1 ja local_variable_2 ei eksisteeri
// static_local_variable jätkab eksisteerimist ja säilitab oma väärtuse
}
int main() {
some_function();
some_function(); // static_local_variable säilitanud oma väärtuse
// Ülemaailmne muutuja on siin kättesaadav
// local_variable_1 ja local_variable_2 ei ole kättesaadavad
return 0;
}
Võrdlustabel
| Omadus | Ülemaailmsed muutujad | Kohalikud muutujad (automaatne) | Staatilised kohalikud muutujad |
|---|---|---|---|
| Eluiga | Alates programmi käivitamisest kuni selle lõpetamiseni | Alates määratlemisest kuni selle ploki väljumiseni | Esmakordse saavutamise kuni programmi lõpuni |
| Salvestuskoht | Statilises mälus (.data, .bss) | Virnas | Statilises mälus (.data, .bss) |
| Initsialiseerimine | Enne main()-i või programmi laadimist |
Ei initsialiseerita automaatselt. Vajab selget initsialiseerimist | Üks kord, esimese saavutamise ajal |
| Ligipääs | Kõigis ulatuses skoopi piires | Ainult selles koodilõigus, kus määratletud | Ainult selles koodilõigus, kus määratletud |