在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的结果显示
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;
}
这个问题是由于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