Qual è il valore indeterminato?

Ho trovato questo in standard C99

3.17.2 1 indeterminate value either an unspecified value or a trap representation 

Questa affermazione sopra non mi è chiara. Qualcuno può spiegare cos’è questo e quali sono i suoi pro e contro?

Alcuni esempi saranno molto apprezzati.

La differenziazione dei due (valori indeterminati e rappresentazioni di trap) è fondamentale. In un caso non hai un valore noto. Nell’altro hai un valore noto non valido.

Esempio più semplice di un valore indeterminato che posso raccogliere:

 int a; int b = a; 

Non esiste un concetto di “valore” determinato associato a a . Ha qualcosa (dato che occupa memoria) ma il “cosa” non è definito, quindi indeterminato. Nel complesso, il concetto è semplice come sembra: a meno che non sia stato deciso cosa sia qualcosa, non può essere usato in nessuna valutazione (si pensi al valore-r se aiuta) con risultati deterministici.

Il valore effettivo dipende dal linguaggio, dal compilatore e dalle politiche di gestione della memoria. Ad esempio, nella maggior parte delle implementazioni di C, una variabile di ambito non inizializzata o la memoria puntata dal puntatore restituito da una chiamata a malloc conterrà qualsiasi valore precedentemente memorizzato in quell’indirizzo. D’altra parte, la maggior parte dei linguaggi di scripting inizializzerà le variabili con un valore predefinito (0, “”, ecc.).

Per quanto riguarda la rappresentazione delle trappole, si tratta essenzialmente di qualsiasi valore al di fuori del dominio limitato dei valori consentiti relativi alla definizione formale sottostante. Ne segue un esempio che spera non confonde. :

 enum FooBar { foo=0, bar=1 }; enum FooBar fb = (enum FooBar)2; 

In generale, ogni modello di bit rientra nello spazio consentito dalla rappresentazione dello storage sottostante (nelle enumerazioni che è probabilmente un int ) ma NON è considerato un “valore” valido per il dominio limitato della sua definizione formale. Una descrizione eccezionale sulle rappresentazioni delle trappole e le loro radici può essere trovata a questa risposta . Quanto sopra è solo un rappresentante di ciò che può apparire come una rappresentazione molto semplice conosciuta come non valida. In realtà è praticato in hardware per il rilevamento di valori che triggersno lo stato non valido. Li considero valori “panico”. Di nuovo, il codice di cui sopra è solo idealistico nel dimostrare il concetto di un “valore”, non è “valido”, ma è, infatti, conosciuto.

Se non diversamente specificato, gli oggetti statici contengono valori di puntatore zero o nulli all’avvio del programma. Gli oggetti allocati automaticamente e dynamicmente vengono inizializzati solo se viene specificato esplicitamente un valore iniziale; in caso contrario, hanno inizialmente valori indeterminati (in genere, qualsiasi modello di bit è presente nello spazio di archiviazione, che potrebbe non rappresentare un valore valido per quel tipo).

Riferimento: WikiPedia