簡體   English   中英

為什么c ++函數的地址總是為True?

[英]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

  1. 為什么每個功能都是真的?
  2. 如果所有函數共享(看起來)相同的地址,那么函數指針如何工作呢?

函數地址不是“true”。 接受任意函數指針的ostream沒有重載。 但是有一個布爾值,函數指針可以隱式轉換為bool。 所以編譯器轉換afunction從不管其價值實際上是true還是false 由於您在地址0處不能使用函數,因此打印的值始終為truecout顯示為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,因為0NULL ,指針無效,超過0的任何內容都為真

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM