繁体   English   中英

为什么函数在定义为 int 时返回 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>

在这个头文件中truefalse是宏,它们相应地扩展为整数常量10

bool扩展为整数类型_Bool

因此,除了调用printf ,程序中不会发生任何转换,其中_Bool类型的对象被提升为int类型。

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

由于printf接受可变数量的参数,因此称为默认参数提升的东西开始发挥作用。 这些说每个小于int整数类型都会自动提升为int ,而且(尽管在这里无关紧要),该类型float被提升为double 所以函数hum的返回值从bool提升到int ,用%d打印它是完全没问题的。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM