L’inizializzazione di sé è valida?

Ho questa domanda, a cui ho pensato 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 del tutto. Se è definito, è il valore di x noto in main ?

Sono abbastanza sicuro che sia definito, e x dovrebbe avere il valore 1. §3.6.2 / 1 dice: “Gli oggetti con durata di memorizzazione statica (3.7.1) devono essere inizializzati a zero (8.5) prima di ogni altra inizializzazione. ”

Dopo ciò, penso che sia tutto abbastanza semplice.

La mia domanda è se il comportamento del programma è definito o indefinito se è valido del tutto. Se è definito, è il valore di x noto in main?

Questo codice non è sicuramente pulito, ma per me dovrebbe funzionare in modo prevedibile.

int x inserisce la variabile nel segmento di dati che è definito come zero all’avvio del programma. Prima di main() , vengono chiamati gli inizializzatori statici. Per x questo è il codice x = x + 1 . x = 0 + 1 = 1 . Quindi il main () restituirebbe 1.

Il codice funzionerebbe sicuramente in modo imprevedibile se x è una variabile locale, allocata sullo stack. Lo stato di stack, a differenza del segmento dati, è praticamente garantito per contenere rifiuti inutili.

La variabile ‘x’ memorizzata in .bss, che viene riempita con 0 quando si carica il programma. Di conseguenza, il valore di ‘x’ è 0 quando il programma viene caricato in memoria.

Quindi, prima che venga chiamato main, viene eseguito “x = x + 1”.

Non so se è valido o meno, ma il comportamento non è indefinito.

Prima che la chiamata principale x sia inizializzata su 0, il suo valore deve essere 1 quello che inserisci main, e tu restituirai 1. È un comportamento definito.