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

pen*_*ope 7 c++ debugging assert

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

#include <cassert>

class A{
    protected:
        bool isM, isN;

    public:
        void someFunction();
};

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

    ... 
}
Run Code Online (Sandbox Code Playgroud)

产生一个assertion failed结果.另一方面,稍微更改代码后:

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

    ...
}
Run Code Online (Sandbox Code Playgroud)

断言通过没有问题,函数正常完成.函数正常完成是预期的功能,因为bool变量是在实际调用之前设置的someFunction().

另外一个问题是,有没有更好的方法在C++中进行断言?我在C上长大,我仍在使用C风格的断言.我刚刚在谷歌的表面划了一下,但没有发现什么暗示有什么新东西.

哦,如果需要,我可以为类和变量提供更多的上下文,如果这还不足以让任何人认识到有问题的情况.该bool变量在子类的实例了实际设定的,而someFunction在实施了罕见的功能之一class A接口,但由于这个问题复杂化,我只会更详细,如果社会认为它相关的编辑.

jua*_*nza 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"; 

}
Run Code Online (Sandbox Code Playgroud)

产生这个输出:

121, 0
244, 31
Run Code Online (Sandbox Code Playgroud)

或者,再次运行,

192, 0
244, 127
Run Code Online (Sandbox Code Playgroud)

或者,用-O3一堆零进行优化。

  • @RedX这是未定义的行为,所以我不会花太多时间试图弄清楚到底发生了什么。 (2认同)