布尔类型的相关提问,如何解决?

在c++,布尔类型bool,只要输入数值是非零的值,输出结果不应该是1吗?那为什么输入0.1的时候,输出的结果为0?
#include
using namespace std;

int main() {

bool flag;
cin >> flag;
cout << "flag的值:"<<flag << endl;

system("pause");
return 0;

}
vs2019的结果显示

img

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7547741
  • 除此之外, 这篇博客: C++学习笔记-C++对C语言的扩充和增强中的 增加了bool类型 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • C++在C语言的基本类型系统之上增加了bool
    C++中的bool可取的值只有true和false
    理论上bool只占用一个字节
    如果多个bool变量定义在一起,可能会各占一个bit,这取决于编译器的实现
    true代表真值,编译器内部用1来表示
    false代表非真值,编译器内部用0来表示
    bool类型只有true(非0)和false(0)两个值
    C++编译器会在赋值时将非0值转换为true,0值转换为false

    int main(int argc, char *argv[])
    {
    	int a;
    	bool b = true;
    
    	printf("b = %d, sizeof(b) = %d\n", b, sizeof(b));
    
    	b = 4;
    	a = b;
    	printf("a = %d, b = %d\n", a, b);
    
    	b = -4;
    	a = b;
    	printf("a = %d, b = %d\n", a, b);
    
    	a = 10;
    	b = a;
    	printf("a = %d, b = %d\n", a, b);
    
    	b = 0;
    	printf("b = %d\n", b);
    
    	system("pause");
    	return 0;
    }
    
  • 以下回答由chatgpt基于相关博客总结生成:

    这个问题是由于C++中的bool类型只有true和false两个取值,非零值会被转化为true,而0会被转化为false。在输入非零数值时,输出结果为1,因为1被转化为true。而输入0.1时,输出结果为0,可能是由于精度问题,在计算机内部实际上被转化为0。如果想要强制把小数转化为bool类型,可以使用static_cast进行类型转换,如下所示:

    #include <iostream>
    using namespace std;
    
    int main() {
        double x = 0.1;
        bool y = static_cast<bool>(x);
        cout << y << endl; // 输出0
        return 0;
    }
    

    如果想要转化非零的数为true,可以使用bool函数,如下所示:

    #include <iostream>
    using namespace std;
    
    int main() {
        int x = 42;
        bool y = bool(x);
        cout << y << endl; // 输出1
        return 0;
    }
    

    其中bool(x)可以将x转化为bool类型,非零值会被转化为true。如果不能解决该问题,可以说明精度问题可能需要使用double类型等高精度计算。

bool类型的数据大小决定它只能接收一位,后面的丢弃了,所以是0