2011-01-07 21 views
22

He declarado una variable booleana bool abc; en una clase y pensé que sería falsa por defecto. Una condición if en mi programa if (abc) resultó ser verdadera, entonces saqué el valor de abc y vi que contenía el valor 55. ¿Es esto normal? ¿Siempre tenemos que asignar 'bool abc = false' para estar seguros de que es falso?Las variables booleanas no siempre son falsas por defecto?

+0

Por qué: http://stackoverflow.com/questions/1910832/c-why-arent-pointers-initialized-with-null-by-default/1910992#1910992 –

+0

[Tenga en cuenta que la lectura de una variable no inicializada lleva a UB .] (http://stackoverflow.com/questions/4259885/why-do-i-see-strange-values-when-i-print-uninitialized-variables/4259991#4259991) Simplemente no lo hagas. – GManNickG

+1

Un error "interesante" que puede aparecer en esta situación es tanto b como! B evaluando a verdadero –

Respuesta

19

Sí, siempre debe inicializar sus variables. Hasta que aprenda íntimamente los tiempos en que es y no es necesario hacerlo explícitamente, debe hacerlo todo el tiempo, pase lo que pase. Y para entonces ... bueno ... ¿por qué dejar un buen hábito?

para inicializar un bool false es suficiente para defecto construirlo:

struct X 
{ 
    bool b; 
    X() : b() {} 
}; 
+8

Me gusta agregar el booleano explícito literal falso (para mí eso lo hace más legible (aunque técnicamente no es diferente del tuyo)). –

21

Hablando de primitiva (bool, char, wchar_t, short, int, long, float incorporado en los tipos de datos, dobles , long double), de acuerdo con el estándar C++, , solo las variables globales obtienen un valor predeterminado de cero si no se inicializan explícitamente.

Para variables locales no es necesario que el compilador limpie el contenido de la memoria a la que están asignados. Una variable local, si no se inicializa explícitamente, contendrá un valor arbitrario.

+5

Técnicamente son variables de 'duración de almacenamiento estático' las variables globales son un miembro de este tipo de variable. –

1

Sí. Debe hacer bool x=false o bool x(false). Las primitivas que no se inicializan pueden tener CUALQUIER valor.

ver wikipedia

+1

o 'bool x = bool();' Funcionará también. –

1

Sí. SIEMPRE inicialice sus variables antes de su uso. Incluso si el lenguaje garantiza que tendrán valores específicos. Si no puede forzarse, obtenga un compilador que se quejará y luego hágalo. :)

Sin embargo, no inicializa los valores a menos que realmente tenga un significado para que se inicialicen. Por ejemplo, si usted tiene un bucle como este (no estoy diciendo que esto es un buen código, es sólo un ejemplo):

int i = 0; 
while ((i = getNum()) == 5) 
{ 
} 

no inicializan a cero i como lo hice. No tiene sentido, y si bien apaga el compilador, introduce la posibilidad de que lo olvide y luego su código se descompondrá. Si puede obligarse a iniciarse solo en el momento adecuado, ni más ni menos, entonces hará que la depuración sea muchísimo más fácil, ya que su wrong code will look wrong even at just a glance.

Por lo tanto, en una línea: nunca inicialice solo para evitar que el compilador se queje, pero siempre inicialícelo antes de usarlo.

4

Solo las variables globales tienen asignado 0 (falso) de forma predeterminada, a las variables locales se les asigna un valor de basura distinto de cero, que se evaluaría como verdadero en una variable booleana.

Cuestiones relacionadas