C++ bool类型变量cin输入true,输出结果却是false?是因为cin输入的true会被当成字符串,所以bool变量原值不变吗?
创始人
2024-03-06 22:49:44
0

首先,大家可能看过其他文章,他们给出的观点是这样的:

在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);

相关内容

热门资讯

AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWR报告解读 WORKLOAD REPOSITORY PDB report (PDB snapshots) AW...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
群晖外网访问终极解决方法:IP... 写在前面的话 受够了群晖的quickconnet的小水管了,急需一个新的解决方法&#x...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
Azure构建流程(Power... 这可能是由于配置错误导致的问题。请检查构建流程任务中的“发布构建制品”步骤,确保正确配置了“Arti...