Questa auto-inizializzazione è valida?
-
27-09-2020 - |
Domanda
Ho questa domanda, che pensavo prima, ma ho capito che non è banale rispondere
int x = x + 1;
int main() {
return x;
}
.
La mia domanda è se il comportamento del programma è definito o indefinito se è valido affatto.Se è definito, è il valore del x
noto in main
?
Soluzione
Sono abbastanza sicuro che è definito, e X dovrebbe avere il valore 1. §3.6.2 / 1 dice: "Gli oggetti con la durata della memoria statica (3.7.1) devono essere inizializzati a zero (8.5) prima di qualsiasi altra inizializzazioneha luogo. "
Dopo, penso che sia tutto piuttosto semplice.
Altri suggerimenti
.La mia domanda è se il comportamento del programma è definito o indefinito se è valido affatto.Se è definito, è il valore di X noto in Main?
Questo codice non è assolutamente pulito, ma per me dovrebbe funzionare prevedibilmente.
int x
Mette la variabile nel segmento dei dati che è definito per essere pari a zero al programma.Prima di main()
, vengono chiamati inizializzatori statici.Per x
che è il codice x = x + 1
.x = 0 + 1 = 1
.Quindi il principale () ritornerebbe 1.
Il codice funzionerebbe sicuramente in modo imprevedibile se x
è una variabile locale, assegnata in pila.Stato di pila, a differenza del segmento dei dati, è praticamente garantito per contenere rifiuti indefiniti.
La variabile 'x' in memorizzata nel .bss, che è riempito con 0S quando si carica il programma.Di conseguenza, il valore di "X" è 0 quando il programma viene caricato in memoria.
Quindi prima che viene chiamato a Main, "X= X + 1" viene eseguito.
Non so se è valido o meno, ma il comportamento non è indefinito.
Prima che la chiamata principale X deve essere inizializzata a 0 pertanto il valore è necessario essere 1 uno che inserisci principale, e ritornerete 1. È un comportamento definito.