默认情况下,布尔变量总是不为假?

时间:2011-01-07 03:18:38

标签: c++ syntax

我在类中声明了一个布尔变量bool abc;,并认为默认情况下它是假的。我的程序if (abc)中的if条件结果为true,因此我输出abc的值,并看到它包含值55.这是正常的吗?我们是否总是必须指定'bool abc = false'以确保它是假的?

5 个答案:

答案 0 :(得分:30)

谈论原始内置数据类型(bool,char,wchar_t,short,int,long,float,double,long double),根据C ++标准,只有全局变量如果没有显式初始化,则获取默认值

对于局部变量,编译器不需要清除分配给它们的内存内容。局部变量 - 如果没有明确初始化 - 将包含任意值。

答案 1 :(得分:26)

是的,您应该始终初始化变量。直到你亲密地了解它的时间并且没有必要明确地这样做,你应该一直这样做,无论如何。到那时......好吧......为什么要戒掉一个好习惯?

要将bool初始化为false,默认构造它就足够了:

struct X
{
  bool b;
  X() : b() {}
};

答案 2 :(得分:6)

默认情况下,只有全局变量被赋值为0(false),任何局部变量都被赋予非零垃圾值,在布尔变量中将其计算为true。

答案 3 :(得分:2)

是。您需要bool x=falsebool x(false)。未初始化的基元可能具有任何值。

请参阅wikipedia

答案 4 :(得分:2)

是。 始终在使用前初始化变量。即使语言保证它们具有特定值。如果你不能强迫自己,那就得到一个会抱怨的编译器,然后让自己这样做。 :)

但是,不会初始化值,除非它真的具有初始化它们的含义。例如,如果你有一个像这样的循环(我不是说这是一个很好的代码,它只是一个例子):

int i = 0;
while ((i = getNum()) == 5)
{
}

不要像我一样将i初始化为零。这没有任何意义,虽然它关闭了编译器,但它会引入您忘记它的可能性,然后您的代码将被搞砸。如果你可以强迫自己只在正确的时间进行初始化 - 不多也不少 - 那么你就可以轻松调试,因为你的wrong code will look wrong even at just a glance

所以,在一行中:永远不要初始化只是为了防止编译器抱怨,但总是在使用之前初始化。