为什么int hum2()
函数返回布尔类型?函数不应该返回我定义它的类型吗?就像Float函数返回Float值,Double函数返回Double值。
#include<stdio.h>
int hum2()
{
return true;
}
bool hum(){
return false;
}
int main()
{
printf("%dn",hum2());
printf("%dn",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积分提升)
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("%dn", hum());
现在,函数hum
被声明为返回bool
,那么如何将其打印为%d
呢?传递给printf
的额外参数和在格式字符串中使用的%
指定符不必须完全匹配吗?
是的,它们必须匹配,但还有三个额外的因素。首先,bool
没有%
指定符。其次,还有一组额外的规则在起作用,因为printf
是特殊的。第三,由于布尔值实际上只是一个数字,0或1,我们会发现在下面,类型bool
实际上将被实现为整数类型,int
或short int
或char
。
由于printf
接受可变数量的参数,因此称为的默认参数提升开始起作用。它们表示,每个小于int
的整数类型都会自动提升为int
,并且(尽管这里无关紧要),类型float
也会提升为double
。因此,函数hum
的返回值从bool
提升到int
,用%d
打印它是完全没问题的。
这里,当您在printf("%dn", hum());
中使用整数说明符(%d
)时,布尔值被隐式地转换为整数。由于printf没有特殊的布尔值说明符,因此不可能直接将true
或false
输出到控制台。
但是您可以使用std::cout
和std::boolapha
标志来获得所需的输出
std::cout << std::boolalpha << hum() << std::endl ;
或printf("%s", hum() ?"true":"false");