逻辑和bool变量的奇怪断言失败

时间:2012-04-03 09:52:55

标签: c++ debugging assert

我的代码中的一些断言刚开始表现得很奇怪,我想知道是否有人之前有过类似的情况。一个简短的代码片段,如:

#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风格的断言。我刚刚在谷歌的表面上划了一下,但没有发现任何新的暗示。

哦,如果需要,我可以为类和变量提供更多上下文,如果这还不足以让任何人识别出有问题的情况。 bool变量实际上是在子类的实例中设置的,而someFunctionclass A接口中实现的罕见功能之一,但由于这使问题复杂化,我只会编辑如果社区认为它是相关的,那就更详细了。

1 个答案:

答案 0 :(得分:4)

布尔人没有初始化。他们可以采取任何价值。这里的行为是未定义的。为了说明这一点,在ubuntu 11.10上使用gcc 4.7快照:

#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优化,一堆零。