¿Las variables inicializadas por defecto son automáticamente cero?
Si no asigno un valor a una variable cuando la declaro, ¿el valor predeterminado es cero o simplemente lo que estaba previamente en la memoria?
p.ej
float x;
Una variable declarada puede ser inicializada en cero , inicializada por valor o inicializada por defecto .
El estándar C++03 8.5/5 define adecuadamente cada uno:
Inicializar a cero un objeto de tipo T significa:
— si T es de tipo escalar (3.9), el objeto se fija al valor 0 (cero) convertido a T;
— si T es un tipo de clase no sindical, cada miembro de datos no estático y cada subobjeto de clase base
está inicializado en cero;
— si T es un tipo de unión, el primer miembro de datos nombrado del objeto tiene inicialización cero;
— si T es un tipo de matriz, cada elemento se inicializa con cero;
— si T es un tipo de referencia, no se realiza ninguna inicialización.
Inicializar por defecto un objeto de tipo T significa:
— si T es un tipo de clase que no es POD (cláusula 9), se llama al constructor predeterminado para T (y la inicialización está mal formada si T no tiene un constructor predeterminado accesible);
— si T es un tipo de matriz, cada elemento se inicializa por defecto;
— de lo contrario, el objeto se inicializa a cero.
Inicializar el valor de un objeto de tipo T significa:
— si T es un tipo de clase (cláusula 9) con un constructor declarado por el usuario (12.1), entonces se llama al constructor predeterminado para T (y la inicialización está mal formada si T no tiene un constructor predeterminado accesible);
— si T es un tipo de clase no sindical sin un constructor declarado por el usuario, entonces cada miembro de datos no estáticos y componente de clase base de T está inicializado por valor;
— si T es un tipo de matriz, entonces cada elemento se inicializa con su valor;
— de lo contrario, el objeto se inicializa a cero
Por ejemplo:
#include<iostream>
using namespace std;
static int a; //Zero Initialized
int b; //Zero Initialized
int main()
{
int i; //Undefined Behavior, Might be Initialized to anything
static int j; //Zero Initialized
cout<<"\nLocal Uninitialized int variable [i]"<<i<<"\n";
cout<<"\nLocal Uninitialized Static int variable [j]"<<j<<"\n";
cout<<"\nGlobal Uninitialized Static int variable [a]"<<a<<"\n";
cout<<"\nGlobal Uninitialized int variable [b]"<<b<<"\n";
return 0;
}
Notarás que los resultados de la variable i
serán diferentes en diferentes compiladores. Estas variables locales no inicializadas NUNCA DEBEN usarse. De hecho, si activa advertencias estrictas del compilador, el compilador informará un error al respecto. Así es como el teclado informa un error.
cc1plus: warnings being treated as errors
In function 'int main()':
Line 11: warning: 'i' is used uninitialized in this function
Editar: Como señaló acertadamente @Kirill V. Lyadvinsky en los comentarios, NUNCA DEBE es una palabra bastante fuerte, y puede haber un código perfectamente válido que podría usar variables no inicializadas, como señala un ejemplo en su comentario. Entonces, probablemente debería decir:
nunca deberías usar variables no inicializadas a menos que sepas exactamente lo que estás haciendo.
Eso depende. Si se trata de una variable local (un objeto con duración de almacenamiento automático), no se inicializará; si es una variable global (un objeto con duración de almacenamiento estático), se inicializará en cero. Consulte también esta respuesta .