¿Las variables inicializadas por defecto son automáticamente cero?

Resuelto CaptainProg asked hace 13 años • 10 respuestas

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;
CaptainProg avatar May 17 '11 21:05 CaptainProg
Aceptado

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 iserá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.

Alok Save avatar May 17 '2011 15:05 Alok Save

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 .

Kirill V. Lyadvinsky avatar May 17 '2011 14:05 Kirill V. Lyadvinsky