Sobes.tech
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.
  • 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