La parola chiave static rende la classe di archiviazione dell'intx statico, il che significa che è essenzialmente una variabile globale che ha il suo ambito ambito dalla funzione. In particolare, la durata di x si estende oltre l'esecuzione della funzione e l'inizializzatore viene eseguito solo una volta.
Quando fun () restituisce il riferimento a x nel codice 1, il riferimento punta alla memoria statica per x. Di conseguenza, l'assegnazione a fun () nel set principale imposta la variabile statica da x a 3, che viene poi restituita quando fun () viene richiamata di nuovo sulla riga successiva. Poiché l'inizializzatore per x viene eseguito solo una volta, la seconda chiamata a fun () non reimposta il valore su 10.
L'esempio nel codice 2 non è valido. Restituire un riferimento a una variabile locale non è valido perché la memoria per la variabile locale non esiste dopo il ritorno della funzione. Sebbene possa sembrare che funzioni in questo caso, il risultato di questo codice non è definito. Poiché le variabili locali sono generalmente memorizzate nello stack, per questa specifica sequenza di codice, il valore nella posizione utilizzata per x non è stato spostato nel cestino e il valore viene impostato dall'inizializzatore in fun (). Ma questo è completamente dipendente dall'implementazione e le specifiche del compilatore non garantiscono questo comportamento.
In effetti, se il codice fosse un po 'più complesso, quel valore potrebbe essere stato cestinato e potresti ottenere un valore casuale stampato. O il codice potrebbe persino bloccarsi. In ogni caso non restituire riferimenti o puntatori a variabili locali in quanto non è un codice valido.