Странный asser fail на логических и булевых переменных - PullRequest
7 голосов
/ 03 апреля 2012

Некоторые утверждения в моем коде только начали странно себя вести, и мне было интересно, была ли у кого-то подобная ситуация раньше. Короткий фрагмент кода, например:

#include <cassert>

class A{
    protected:
        bool isM, isN;

    public:
        void someFunction();
};

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

    ... 
}

дает результат assertion failed. С другой стороны, после незначительного изменения кода:

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

    ...
}

утверждения проходят без проблем и функция завершается нормально. Завершение функции обычно является ожидаемой функциональностью, поскольку переменные bool устанавливаются перед фактическим вызовом someFunction().

В качестве дополнительного вопроса, есть ли лучший способ сделать утверждения в C ++? Я вырос на C и до сих пор использую утверждения в стиле C. Я только что поцарапал поверхность Google на этом, но не нашел ничего намекающего, что есть что-то новое.

Да, и, если необходимо, я могу предоставить больше контекста для класса и переменных, если этого недостаточно, чтобы кто-либо смог распознать проблемную ситуацию. Переменные bool фактически устанавливаются в экземпляре подкласса, тогда как someFunction является одной из редких функций, реализованных в интерфейсе class A, но, поскольку это усложняет вопрос, я отредактирую его более подробно, только если сообщество считает это актуальным.

1 Ответ

4 голосов
/ 03 апреля 2012

Логические значения неинициализированы.Они могут принять любое значение.Поведение здесь не определено.Чтобы проиллюстрировать это, при использовании снимка gcc 4.7 в 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"; 

}

дает такой вывод:

121, 0
244, 31

или, при повторном запуске,

192, 0
244, 127

или, оптимизация с -O3, куча нулей.

...