为什么函数被定义为int时返回bool ?



为什么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>

标题中的truefalse是宏,它们分别展开为整数常量10

bool展开为整型_Bool

因此,除了调用printf(将类型为_Bool的对象提升为类型为int)之外,程序中没有发生任何转换。

在c++中,布尔字面值truefalse被转换为第一个函数的返回类型。将字面值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实际上将被实现为整数类型,intshort intchar

由于printf接受可变数量的参数,因此称为的默认参数提升开始起作用。它们表示,每个小于int的整数类型都会自动提升为int,并且(尽管这里无关紧要),类型float也会提升为double。因此,函数hum的返回值从bool提升到int,用%d打印它是完全没问题的。

这里,当您在printf("%dn", hum());中使用整数说明符(%d)时,布尔值被隐式地转换为整数。由于printf没有特殊的布尔值说明符,因此不可能直接将truefalse输出到控制台。

但是您可以使用std::coutstd::boolapha标志来获得所需的输出

std::cout << std::boolalpha << hum() << std::endl ;

printf("%s", hum() ?"true":"false");

不太好的选项

相关内容

  • 没有找到相关文章

最新更新