2010-10-02 37 views
9

Supongamos que tengo una estructura llamada foo_boolean que contiene algunos valores booleanos:lo que será el valor predeterminado de un valor booleano inicializado en C++

struct foo_boolean { 
    bool b1; 
    bool b2; 
}; 

Si defino una variable de tipo foo_boolean sin inicializarla, lo hará el valor predeterminado de las variables miembro es? (es decir, verdadero, falso o un valor aleatorio de los dos.)

+3

Para el registro, la ortografía correcta de la palabra es * boolean *. – avakar

Respuesta

14

Depende de cómo se crea. Si la estructura está construida por inicialización predeterminada p.

void foo() { 
    fool_boolen x; // <--- 

continuación, los valores serán indefinidos (ocurrirán cosas malas si lo lee antes de fijar un valor).

Por otro lado, si la estructura se construye por valor de inicialización o cero inicialización por ejemplo

fool_boolen x; // <-- 

void foo2() { 
    static fool_boolen y; // <-- 
    fool_boolen z = fool_boolen(); // <-- 

entonces los valores serán cero, es decir, falsa.

1

si quiere decir bool el valor inicial es desconocido.

+0

es conocido, verdadero o falso, pero no está definido –

+1

@Chris no, ni siquiera está garantizado que el bool tenga algún valor. Puede contener un patrón de bits que no representa ni verdadero ni falso. –

+0

@Johannes: sí, leí la respuesta que menciona el Estándar después de escribir mi comentario. Sería interesante encontrar una arquitectura que lo haga posible. –

9

El valor de bool será indefinido. Será todo lo que haya en la pila antes, que a veces se pone a cero si nada lo ha usado anteriormente.

Pero nuevamente, no está definido, lo que significa que puede ser verdadero o falso.

Si necesita un valor por defecto, que puede hacer:

struct fool_bool { 
    bool b1; 
    bool b2; 
    fool_bool() { 
    b1 = true; 
    b2 = false; 
    } 
}; 

Esto hace b1 true por defecto, y b2 falsa.

0

Producirá números aleatorios, ¿Por qué? porque i probado con g ++:

#include <iostream> 

using namespace std; 

struct fool_bool 
{ 
    bool a; 
bool b; 
}; 

int main(int argc, char **argv) 
{ 
fool_bool fb1; 
cout << fb1.a << " : " << fb1.b << endl; 
} 

la primera prueba me mostraron 121, 235 y el segundo me mostraron, 34, 331 por lo que será fácil de averiguar!

+4

¿Tu compilador cambió tu ':' a un ','? – Default

+0

Es una pena que a esta publicación se le hayan dado tantos votos a la baja. Si bien no se establece con claridad, esto responde a la pregunta del OP al mostrar que el valor será indefinido. Aunque alguna explicación hubiera sido agradable, su respuesta es correcta. – psyklopz

-2

Según mi entendimiento,

si u declarar el objeto como global o estática a continuación, los valores deben ser inicializados a falso.

De lo contrario, los valores no se inicializan (básicamente podría ser verdadero/falso).

+0

¿por qué se iniciará en falso cuando se declare como global o estático? –

+2

@Haiyuan: El estándar dice "los objetos con duración estática o de almacenamiento de hilo tienen inicialización cero". – aeh

+0

Según lo manifestado por los comentarios en la respuesta de @ MBZ, esto no es correcto. Un booleano puede ser "desconocido", es decir, ni verdadero ni falso. En realidad, no lo sabía hasta que lo observé hace unos minutos. Comparar tal bool con verdadero o falso siempre devuelve verdadero (aunque no sé si está especificado o depende del compilador). ¡Bastante raro! – lex82

4

De docs estándar, 3.9.1.6.

Values of type bool are either true or false.47)

47)

Using a bool value in ways described by this International Standard as “undefined,” such as by examining the value of an uninitialized automatic variable, might cause it to behave as if it is neither true nor false.

Por lo tanto, no está definido ..

-1

En VS 2012, se encontrará con C4700 de error si no inicializa la variable bool: uninitialized local variable 'temp' used

Sin embargo, en VS 2005 que le permitirá construir, pero durante el tiempo de ejecución que se encontrará con este error: Run-Time Check Failure #3 - The variable 'a' is being used without being defined.

Cuestiones relacionadas