【问题标题】:Why does function return bool when it is defined as an int?为什么函数定义为int时返回bool?
【发布时间】:2021-12-10 04:33:56
【问题描述】:

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

【问题讨论】:

  • 自动类型提升。 Bool 转换为 int
  • 是什么让您认为它确实返回布尔值?
  • 答案取决于您使用的语言,因为 C 最初并不知道 boolean 或 bool。因此,请选择您想要回答的语言,不要标记其他语言。我假设您询问的是 C++ 而不是 C,因为显示的代码确实编译为 C++ 但不是 C。这里tutorialspoint.com/compile_c_online.php 和这里tutorialspoint.com/compile_cpp_online.php
  • 我不明白这个问题。为什么你认为hum2 在这里返回一个布尔类型?它显然返回了int
  • 在带有 cout 等的 C++ 中,如果您打开 boolalpha 选项en.cppreference.com/w/cpp/io/manip/boolalpha,您可以让它打印出 bool

标签: c++ boolean implicit-conversion integer-promotion


【解决方案1】:

为了使程序成为正确的 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 类型的纯右值, 假变零,真变一。

因此,无论您的程序是使用 C 编译器还是 C++ 编译器编译的,在任何情况下,如果函数返回类型为 int,函数都会返回整数值。

【讨论】:

  • 一个补码:在 C 中,0 为假,任何其他值为真。(例如:42 为真)
  • @PtitXav 就像在 C++ 中一样,除 0 以外的任何值都是真,包括负数。
  • @Ptitxav:这是一个完全不同的话题。 Vlad 正在谈论将布尔值 falsetrue 转换为 int 类型的结果,而您的评论是关于将 int 值转换为 falsetrue 的结果。
【解决方案2】:

为什么函数定义为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 的额外参数和您在格式字符串中使用的%-specifiers 是否必须完全匹配?

是的,它们确实必须匹配,但还有三个额外的因素。首先,bool 没有 % 说明符。其次,还有一组额外的规则在起作用,因为printf 很特别。第三,由于布尔值实际上只是一个数字,0 或 1,我们会发现在下面,bool 类型实际上将被实现为整数类型,intshort intchar

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

【讨论】:

    【解决方案3】:

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

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

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

    或者printf("%s", hum() ?"true":"false");这个不太好的选项

    【讨论】:

    • %d in printf 不会将参数转换为整数。此外,没有隐式强制转换之类的东西。强制转换是执行转换的显式运算符(C 或 C++ 中的(type),以及 C++ 中的static_cast&lt;type&gt;(expression) 和类似形式)。这使其成为显式转换。有隐式转换。 %d 不会导致任何参数的隐式转换。
    猜你喜欢
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    • 2018-05-27
    • 2012-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多