¿Qué es el valor indeterminado?

Encontré esto en el estándar c99

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

Esta statement anterior no está clara para mí. ¿Alguien puede explicar qué es esto y cuáles son sus pros y sus contras?

Algún ejemplo será muy apreciado.

La diferenciación de los dos (valores indeterminados y representaciones de trampas) es fundamental. En un caso no tienes valor conocido. En el otro tienes un valor conocido-inválido.

El ejemplo más simple de un valor indeterminado que puedo reunir:

 int a; int b = a; 

No hay un concepto de ‘valor’ determinado asociado con a . Tiene algo (ya que ocupa la memoria) pero el “qué” que tiene no está definido, por lo tanto, es indeterminado. En general, el concepto es tan simple como parece: a menos que se haya decidido qué es algo, no puede usarse en ninguna evaluación (piense r-value si ayuda) con resultados deterministas.

El valor real depende de las políticas de gestión de idioma, comstackdor y memoria. Por ejemplo, en la mayoría de las implementaciones de C, una variable de scope sin inicializar o la memoria apuntada por el puntero devuelto por una llamada a malloc contendrá cualquier valor que se haya almacenado previamente en esa dirección. Por otro lado, la mayoría de los lenguajes de scripting inicializarán las variables a algún valor predeterminado (0, “”, etc.).

Con respecto a la Representación de trampas, es esencialmente cualquier valor que esté fuera del dominio restringido de los valores permitidos pertenecientes a la definición formal subyacente. Un ejemplo esperanzador no confuso sigue. :

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

En general, es cualquier patrón de bits que se encuentre dentro del espacio permitido por la representación de almacenamiento subyacente (en enums que probablemente sea un int ) pero NO se considera un “valor” válido para el dominio restringido de su definición formal. Una descripción sobresaliente de las representaciones de trampas y sus raíces se puede encontrar en esta respuesta . Lo anterior es solo un representante de lo que puede parecer una representación muy simple conocida no válida. En realidad, se practica en hardware para la detección de valores que activan el estado no válido. Pienso en ellos como valores de “pánico”. Nuevamente, el código anterior es únicamente idealista al demostrar el concepto de “valor”; esto no es “válido”, pero, de hecho, se conoce.

A menos que se especifique lo contrario, los objetos estáticos contienen valores de puntero nulo o cero al iniciar el progtwig. Los objetos asignados automática y dinámicamente se inicializan solo si se especifica explícitamente un valor inicial; de lo contrario, inicialmente tienen valores indeterminados (por lo general, cualquier patrón de bits que esté presente en el almacenamiento, que incluso podría no representar un valor válido para ese tipo).

Referencia: WikiPedia