我在类中声明了一个布尔变量bool abc;
,并认为默认情况下它是假的。我的程序if (abc)
中的if条件结果为true,因此我输出abc的值,并看到它包含值55.这是正常的吗?我们是否总是必须指定'bool abc = false'以确保它是假的?
答案 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=false
或bool x(false)
。未初始化的基元可能具有任何值。
请参阅wikipedia
答案 4 :(得分:2)
是。 始终在使用前初始化变量。即使语言保证它们具有特定值。如果你不能强迫自己,那就得到一个会抱怨的编译器,然后让自己这样做。 :)
但是,不会初始化值,除非它真的具有初始化它们的含义。例如,如果你有一个像这样的循环(我不是说这是一个很好的代码,它只是一个例子):
int i = 0;
while ((i = getNum()) == 5)
{
}
不要像我一样将i
初始化为零。这没有任何意义,虽然它关闭了编译器,但它会引入您忘记它的可能性,然后您的代码将被搞砸。如果你可以强迫自己只在正确的时间进行初始化 - 不多也不少 - 那么你就可以轻松调试,因为你的wrong code will look wrong even at just a glance。
所以,在一行中:永远不要初始化只是为了防止编译器抱怨,但总是在使用之前初始化。