首頁  >  文章  >  後端開發  >  為什麼在 C 中列印函數指標而不呼叫會產生“1”?

為什麼在 C 中列印函數指標而不呼叫會產生“1”?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-10-25 07:37:29139瀏覽

Why Does Printing a Function Pointer Without Invocation Yield

在沒有呼叫的情況下列印函數指標:理解1 的神秘輸出

在一個有趣的程式碼片段中,一個函數被「呼叫」而沒有呼叫呼叫其括號("pr;"),然後使用std::cout 列印。令人驚訝的是,結果始終為 1,違背了預期。

常數1 之謎

程式碼以三種不同的方式呼叫函數pr:

<code class="cpp">cout << pr;  // output: 1
cout << *pr; // output: 1
cout << &pr; // output: 1

顯示直覺應該列印函數指標而不是應該列印函數指標而不是應該列印函數指標神秘的1。然而,要理解這種行為需要更深入地研究 C 的類型轉換機制。

型別轉換和 Bool 值

當作為參數傳遞給 cout 時,pr 是隱式的轉換為布林值。發生這種轉換是因為 bool 是基本類型,而 cout 需要基本類型作為輸入。在 C 中,如果原始值非零,則轉換後的 bool 值為 true;如果原始值為零,則轉換為 false。

由於 pr 是函數指針,因此它的值是非零記憶體位址。因此,當轉換為 bool 時,它的計算結果為 true,cout 輸出為 1。

自訂函數指標列印(C 11 以上)

C 11 引入一個可自訂的重載,允許列印更多資訊的函數指標:

<code class="cpp">template <class RType, class ... ArgTypes>
std::ostream & operator<<(std::ostream & s, RType(*func)(ArgTypes...))
{
    return s << "(func_ptr=" << (void*)func << ")(num_args=" << sizeof...(ArgTypes) << ")";
}</code>

此重載列印函數指標的位址及其所採用的參數數量。它可以用於列印 pr,如下所示:

<code class="cpp">cout << pr; // output: (func_ptr=0x12345678)(num_args=0)</code>

這種方法提供了更具描述性的輸出,使得更容易理解函數指標的屬性。

以上是為什麼在 C 中列印函數指標而不呼叫會產生“1”?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn