[英]why is the address of a c++ function always True?
為什么會,
#include <iostream>
using namespace std;
int afunction () {return 0;};
int anotherfunction () {return 0;};
int main ()
{
cout << &afunction << endl;
}
給這個,
1
函數地址不是“true”。 接受任意函數指針的ostream沒有重載。 但是有一個布爾值,函數指針可以隱式轉換為bool。 所以編譯器轉換afunction
從不管其價值實際上是true
還是false
。 由於您在地址0
處不能使用函數,因此打印的值始終為true
, cout
顯示為1
。
這說明了為什么隱式轉換通常不受歡迎。 如果轉換為bool
是顯式的,那么你會遇到編譯錯誤而不是默默地做錯事。
開箱即用的std::ostream
不支持函數指針類型。 你的指針被轉換為只有可能的兼容類型 - bool
- 由於向后兼容C,所以非零的東西都是true
。
函數指針(流操縱器除外)沒有operator<<
的重載,但是有一個用於bool
,因此函數指針在顯示之前轉換為該類型。
地址不相等,但它們都是非空的,因此它們都轉換為true
。
沒有重載函數: operator<<(ostream&, int(*)())
,所以你的函數指針被轉換成唯一有效的類型bool
。 然后operator<<(ostream&, bool)
打印轉換后的值:1。
您可以像這樣打印功能地址:
cout << (void*)&afunction << endl;
C ++中的所有地址都不為零,因為零是NULL指針並且是保留值。 任何非零值都被視為真。
對於iostream <<運算符,函數指針不能有重載,因為有無數個可能的函數指針類型。 因此,函數指針會應用轉換,在本例中為bool。 嘗試:
cout << (void *) afunction << endl;
哪個會給你十六進制的地址 - 對我來說結果是:
0x401344
你也檢查過anotherfunction()
嗎?
無論如何,C ++指針地址,如C指針地址,通常在大多數平台上是虛擬的,並不直接對應於內存位置。 因此,該值可能非常小或不常見。
此外,它們將始終為true,因為0
為NULL
,指針無效,超過0的任何內容都為真
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.