2012-04-03 8 views
6

Algunas afirmaciones en mi código simplemente comenzaron a actuar de forma extraña, y me preguntaba si alguien antes había tenido una situación similar. Un fragmento de código corto, como:Extraño afirmar que no funciona en las variables lógicas y de bool

#include <cassert> 

class A{ 
    protected: 
     bool isM, isN; 

    public: 
     void someFunction(); 
}; 

A::someFunction(){ 
    assert (this->isM && this->isN); 

    ... 
} 

produce un resultado assertion failed. Por otro lado, después de cambiar el código ligeramente:

A::someFunction(){ 
    assert(this->isM); 
    assert(this->isN); 

    ... 
} 

las aserciones pasan sin ningún problema y la función finaliza normalmente. El acabado de funciones normalmente es la funcionalidad esperada, ya que las variables bool se establecen antes de la llamada real al someFunction().

Como una pregunta adicional, ¿hay una mejor manera de hacer aserciones en C++? Crecí en C y sigo usando las afirmaciones de estilo C. Acabo de arañar la superficie de Google en esto, pero no encontré nada que sugiera que haya algo nuevo.

Ah, y si es necesario, puedo proporcionar más contexto para la clase y las variables si esto no es suficiente para que alguien pueda reconocer la situación problemática. Las variables bool se configuran realmente en una instancia de una subclase, mientras que someFunction es una de las pocas funcionalidades implementadas en la interfaz class A, pero como esto complica la pregunta, solo la editaré con más detalle si la comunidad lo considera relevante.

+0

¿quiere decir que las variables 'bool' se establecen antes de la llamada a' someFunction() '? – juanchopanza

+0

¿Los bools están configurados o no? – dexametason

+0

C++ 11 trae 'static_assert', que es una aserción en tiempo de compilación. Creo que también está disponible en boost para versiones anteriores de C++. – RedX

Respuesta

3

Los booleanos no están inicializados. Podrían tomar cualquier valor. El comportamiento aquí no está definido. Para ilustrar que, utilizando un gcc 4.7 instantánea en ubuntu 11.10:

#include <iostream> 

struct A { 
    bool a, b; 
}; 

int main() { 

    A a0; 
    std::cout << a0.a << ", " << a0.b << "\n"; 

    A a1; 
    std::cout << a1.a << ", " << a1.b << "\n"; 

} 

produce esta salida:

121, 0 
244, 31 

o, a correr de nuevo,

192, 0 
244, 127 

o, optimizando con -O3, una montón de ceros.

+0

¿cuál es la diferencia entre los fragmentos de salida que pones allí? – penelope

+0

@penelope Acabo de ejecutar el programa dos veces. – juanchopanza

+0

ah :) son completamente iguales. Supongo que fue un poco confuso – penelope

Cuestiones relacionadas