2011-01-07 97 views
22

我已经在一个类中声明了一个布尔变量bool abc;,并认为它默认为false。我的程序if (abc)中的if条件证明是真的,所以我输出abc的值,并且看到它包含值55.这是正常的吗?我们是否总是必须分配'bool abc = false'以确保它是错误的?默认情况下,布尔变量并不总是假?

+0

为什么:http://stackoverflow.com/questions/1910832/c-why-arent-pointers-initialized-with-null-by-default/1910992#1910992 – 2011-01-07 08:52:18

+0

[请注意,读取未初始化的变量会导致UB 。](http://stackoverflow.com/questions/4259885/why-do-i-see-strange-values-when-i-print-uninitialized-variables/4259991#4259991)只是不这样做。 – GManNickG 2011-01-07 23:02:38

+1

在这种情况下可能出现的一个'有趣'的错误是b和!b评估为true – 2012-08-02 09:06:42

回答

19

是的,你应该总是初始化你的变量。直到你亲身了解时间,并且没有必要明确这样做时,无论如何你都应该一直这样做。到那时......嗯......为什么要停止一个好习惯?

要初始化一个bool为false它足以为默认构造它:

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

我喜欢添加显式布尔文字false(对我来说,使它更具可读性(尽管技术上与你的没有区别))。 – 2011-01-07 08:48:12

21

谈到原始的内置数据类型(布尔,焦炭,wchar_t的,short,int和长,浮动,双,long double),根据C++标准,只有全局变量的默认值为零,如果它们没有明确初始化。

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

1

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

参见wikipedia

1

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

但是,不要初始化值,除非它真的有一个含义,他们被初始化。举例来说,如果你有一个这样的循环(我并不是说这是一个好代码,这只是一个例子):

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

不要初始化i为零像我一样。这是毫无意义的,尽管它关闭了编译器,但它引入了可能性,你会忘记它,然后你的代码会被搞乱。如果您可以强制自己在适当的时候初始化 - 不多也不少 - 那么从wrong code will look wrong even at just a glance开始,您将更容易进行调试。

所以,在一行中:永远不要初始化,以防止编译器抱怨,但始终在使用前初始化。

4

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

相关问题