![](/img/trans.png)
[英]Why does gcc not warn when an enum or int value is passed on as a function's argument which is bool?
[英]Why does function return bool when it is defined as an int?
为什么int hum2()
函数返回布尔类型? 函数不应该返回我定义的类型。 就像 Float 函数返回浮点值一样,Double 函数返回一个双精度值。
#include<stdio.h>
int hum2()
{
return true;
}
bool hum(){
return false;
}
int main()
{
printf("%d\n",hum2());
printf("%d\n",hum());
return 0;
}
为了使程序成为正确的 C 程序,您需要包含头文件stdbool.h
。
#include <stdbool.h>
在这个头文件中true
和false
是宏,它们相应地扩展为整数常量1
和0
。
宏bool
扩展为整数类型_Bool
。
因此,除了调用printf
,程序中不会发生任何转换,其中_Bool
类型的对象被提升为int
类型。
在 C++ 中,布尔文字true
和false
被转换为第一个函数的返回类型的值。 文字true
转换为整数值1
,文字false
转换为整数值0
。
来自 C++ 14 标准(4.5 Integral 促销)
6 bool 类型的纯右值可以转换为 int 类型的纯右值,false 变为 0,true 变为 1。
因此,您的程序是使用 C 编译器或 C++ 编译器编译的,如果函数返回类型为int
则函数返回整数值。
为什么函数在定义为 int 时返回 bool?
好吧,为什么它返回是因为这就是您编写它的方式,但我想您会问,这是如何/为什么工作的?
答案是为了方便起见,C 完全愿意在不同类型的值之间执行许多隐式转换。 这通常是一件好事,一旦习惯了,您就会感激不尽。
让我们来看看您可能感到困惑的行。
int hum2()
{
return true;
}
如果函数hum2
被声明为返回int
,你怎么能从中返回这个布尔值? 好吧,在内心深处,布尔值只是一个数字,通常是 0 或 1。所以将该数字作为int
返回没有问题。 编译器通常甚至不会警告您。 部分原因是,曾几何时,C 甚至没有单独的布尔类型,每个人都使用int
(或其他一些整数类型)来存储他们的 1/0 真/假值。
这里的情况有点像声明一个函数
double one()
{
return 1;
}
这里函数one
被声明为返回类型double
,但我们返回一个int
。 这是如何运作的? 好吧,再一次,编译器完全愿意执行隐式转换。
您可能感到困惑的另一行是这一行:
printf("%d\n", hum());
现在,函数hum
被声明为返回bool
,那么你怎么能把它打印为%d
呢? 您传递给printf
的额外参数和您在格式字符串中使用的%
说明符是否必须完全匹配?
是的,它们确实必须匹配,但还有另外三个因素。 首先, bool
没有%
-说明bool
。 其次,还有一组额外的规则在起作用,因为printf
是特殊的。 第三,由于布尔值实际上只是一个数字,0 或 1,我们会发现在下面,类型bool
实际上将被实现为整数类型, int
或short int
或char
。
由于printf
接受可变数量的参数,因此称为默认参数提升的东西开始发挥作用。 这些说每个小于int
整数类型都会自动提升为int
,而且(尽管在这里无关紧要),该类型float
被提升为double
。 所以函数hum
的返回值从bool
提升到int
,用%d
打印它是完全没问题的。
在这里,当您在printf("%d\\n", hum());
中使用整数说明符( %d
)时 ,布尔值被隐式转换为整数。 由于 printf 没有用于布尔值的特殊说明符,因此无法将true
或false
直接输出到控制台。
但是您可以使用带有std::boolapha
标志的std::cout
来获得所需的输出
std::cout << std::boolalpha << hum() << std::endl ;
或者printf("%s", hum() ?"true":"false");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.