2012-04-03 5 views
6

Pewne twierdzenia w moim kodzie zaczęły działać dziwnie, a ja zastanawiałem się, czy wcześniej ktoś miał podobną sytuację. Krótki fragment kodu, takich jak:Dziwne potwierdzenie błędów logicznych i boolowych

#include <cassert> 

class A{ 
    protected: 
     bool isM, isN; 

    public: 
     void someFunction(); 
}; 

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

    ... 
} 

produkuje assertion failed wynik. Z drugiej strony, po nieznacznie zmianie kodu:

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

    ... 
} 

asercje przechodzą bez problemu, a funkcja kończy się normalnie. Wykańczanie funkcji jest zwykle oczekiwaną funkcjonalnością, ponieważ zmienne bool są ustawiane przed faktycznym wywołaniem na someFunction().

Jako dodatkowe pytanie, czy istnieje lepszy sposób robienia asercji w C++? Dorastałem na C i nadal używam twierdzeń w stylu C. Właśnie podrapałem się w Google, ale nic nie wskazywało na to, że jest coś nowego.

Och, i jeśli to konieczne, mogę podać więcej kontekstu dla klasy i zmiennych, jeśli to nie wystarczy, aby ktokolwiek mógł rozpoznać problematyczną sytuację. Zmienne bool są w rzeczywistości ustawione w instancji podklasy, a someFunction jest jedną z rzadkich funkcjonalności zaimplementowanych w interfejsie class A, ale ponieważ komplikuje to pytanie, będę je edytować bardziej szczegółowo, jeśli społeczność uzna to za istotne.

+0

masz na myśli, że zmienne 'bool' są ustawione przed wywołaniem' someFunction() '? – juanchopanza

+0

Czy ustawione są bool? – dexametason

+0

C++ 11 wprowadza 'static_assert', który jest asercją czasu kompilacji. Myślę, że jest on również dostępny w wersji boost dla poprzednich wersji C++. – RedX

Odpowiedz

3

Booleans są niezainicjowane. Mogą mieć dowolną wartość. Zachowanie tutaj jest niezdefiniowane. W celu zilustrowania, że ​​za pomocą gcc 4,7 migawkę 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"; 

} 

dała następujący wynik:

121, 0 
244, 31 

lub uruchomiony ponownie

192, 0 
244, 127 

lub optymalizacja z -O3, A wiązka zer.

+0

jaka jest różnica między wstawionymi tam fragmentami wyjściowymi? – penelope

+0

@penelope Właśnie uruchomiłem program dwa razy. – juanchopanza

+0

ah :) są zupełnie takie same. domyślam się, że to było trochę mylące – penelope