En pocas palabras, var
no se inicializa y la lectura de una variable no inicializada lleva a undefined behavior.
Así que no lo hacen. En el momento en que lo haga, ya no se garantiza que su programa hará lo que usted diga.
Formalmente, "leer" un valor significa realizar una conversión lvalue-r-value en él. Y §4.1 afirma "... si el objeto no está inicializado, un programa que necesita esta conversión tiene un comportamiento indefinido."
vista pragmático, que simplemente significa que el valor es basura (después de todo, es fácil ver la lectura de un int
, por ejemplo, sólo se pone bits aleatorios), pero no podemos concluir esto, o estaríamos . definir un comportamiento indefinido
Para un ejemplo real, tenga en cuenta:
#include <iostream>
const char* test()
{
bool b; // uninitialized
switch (b) // undefined behavior!
{
case false:
return "false"; // garbage was zero (zero is false)
case true:
return "true"; // garbage was non-zero (non-zero is true)
default:
return "impossible"; // options are exhausted, this must be impossible...
}
}
int main()
{
std::cout << test() << std::endl;
}
ingenuamente, uno podría concluir (a través del razonamiento en los comentarios) que esto nunca debe imprimir "impossible"
, pero con un comportamiento indefinido, todo es posible Compilarlo con g++ -02
.
Al compilar este código. ¿El compilador no genera muchas advertencias sobre variables no inicializadas? Si configura su compilador para tratar las advertencias como errores (una buena idea) y también aumenta el nivel de advertencia, entonces no compilará y creará un código más seguro (las advertencias suelen ser errores lógicos). –
sí, compilo este código con gcc en ubuntu. no fue ninguna advertencia. – cmuse
@cmuse - compilar con '-Wall', te ayudará a detectar más advertencias. Y este problema aparecerá una vez que use esa bandera. 'gcc -Wall source.c -o myexecutable' – birryree