[英]Why does gcc not warn when an enum or int value is passed on as a function's argument which is 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>
在這個頭文件中true
和false
是宏,它們相應地擴展為整數常量1
和0
。
宏bool
擴展為整數類型_Bool
。
因此,除了調用printf
,程序中不會發生任何轉換,其中_Bool
類型的對象被提升為int
類型。
在 C++ 中,布爾文字true
和false
被轉換為第一個函數的返回類型的值。 文字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
實際上將被實現為整數類型, int
或short int
或char
。
由於printf
接受可變數量的參數,因此稱為默認參數提升的東西開始發揮作用。 這些說每個小於int
整數類型都會自動提升為int
,而且(盡管在這里無關緊要),該類型float
被提升為double
。 所以函數hum
的返回值從bool
提升到int
,用%d
打印它是完全沒問題的。
在這里,當您在printf("%d\\n", hum());
中使用整數說明符( %d
)時 ,布爾值被隱式轉換為整數。 由於 printf 沒有用於布爾值的特殊說明符,因此無法將true
或false
直接輸出到控制台。
但是您可以使用帶有std::boolapha
標志的std::cout
來獲得所需的輸出
std::cout << std::boolalpha << hum() << std::endl ;
或者printf("%s", hum() ?"true":"false");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.