簡體   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