我的代码中的一些断言刚开始表现得很奇怪,我想知道是否有人之前有过类似的情况。一个简短的代码片段,如:
#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
变量实际上是在子类的实例中设置的,而someFunction
是class A
接口中实现的罕见功能之一,但由于这使问题复杂化,我只会编辑如果社区认为它是相关的,那就更详细了。
答案 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
优化,一堆零。