首先,大家可能看过其他文章,他们给出的观点是这样的:
在C++中bool类型的变量初始值为false,所以如果你不初始化,那么对变量使用cin>>赋值true和false的时候,编译器会把true和false当成是字符串,因此bool变量的值不会变,还是原来的false,所以输出结果为0;
并且他还给出了验证,如下:
看起来没毛病,并且他们还验证了如果不初始化变量aaa那么它的值为false这个结论,由于局部变量不赋值无法输出,所以使用了全局变量,如下:
也是没有毛病,所以他的观点验证完毕;
但是呢,在这里我想说的是,上面这个观点只说对了一半
C++中bool的全局变量如果不初始化,那么默认为false没毛病;
编译器会把true和false当成字符串,也没毛病;
但是bool变量如果赋值true和false这样的字符串的话,原来的值不会变,这句话就有问题了;
真正的结论应该是:如果给bool变量使用cin等赋值字符串的话,编译器看到字符串会当成0;
我们还是使用第一次验证的代码,我们这次一个一个的给这些bool变量赋值,如下:
aaa:
bbb:
ccc:
我们看到,无论bool变量有没有赋初始值,并且无论初始化是true还是false,一旦我们使用cin给bool变量赋值true和false,编译器都会当成字符串,所以bool变量的值都会变成0;
那么为什么我们文章开头使用别人的论证方法,他们输出的结果看起来也没毛病呢?
我们再仔细看看:
编译器以为我们的三个true加上中间的空格是同一个字符串,所以整个"true true true\n"这么一个字符串编译器只赋值给了aaa,因为我们上面说的,如果使用cin等赋值字符串的话,那么变量aaa的值会变成0,也就是false;
如果不相信这个结论的话,可以再次尝试,这次我们把aaa初始化为true,如下:
没毛病了。大家也可以尝试其他字符串,结果也会是0;另外,如果输入数字的话,那么除了0,其他都是1;
总结:
1、C++bool类型全局变量,如果不赋初始值的话,默认为false;
2、如果bool类型变量使用cin等等进行赋值true和false的话,编译器会把true和false当成字符串,最终导致被赋值的变量输出结果为0(false);
3、我们一般定义bool变量的时候都会赋初始值,并且再之后给bool变量赋值的时候我们一般都是直接赋值,比如aaa=true;而不是cin>>aaa;如果使用cin赋值bool的话,我们一般输入0(false)或者1(true);