首頁  >  文章  >  後端開發  >  為什麼在 C 中列印函數名稱會導致“1”?

為什麼在 C 中列印函數名稱會導致“1”?

Patricia Arquette
Patricia Arquette原創
2024-10-26 03:40:03726瀏覽

Why Does Printing a Function Name in C   Result in

計算一個不調用的函數:解開謎團

想像一下:你正在編碼,而不是調用帶括號的函數,您帶括號的函數,您只需列印它的名稱即可。令人驚訝的是,結果總是 1。這種非常規的方法讓您感到困惑,無論是關於 1 還是缺少預期的函數指標。

讓我們深入研究程式碼的複雜性:

<code class="c++">#include <iostream>
using namespace std;

void pr()
{
    cout << "sth";
}

int main()
{
    pr;
    cout << pr; // output: 1
    cout << *pr; // output: 1
    cout << &pr; // output: 1
}

與您的意圖相反,您實際上並沒有在 cout<< 中調用函數 pr聲明。相反,您將其函數指標傳遞給 cout。這會導致 pr 隱式轉換為布林值,從而導致輸出中普遍存在 1。

為了增強您的理解,請考慮使用 cout <<列印前的布林阿爾法。這將顯示 true 而不是 1,從而增強了輸出的布林性質。

雖然 C 11 提供了一個優雅的解決方案:

<code class="c++">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>

此重載允許您列印任意數量的函數指針,顯示函數指針的位址及其參數數量等資訊。

所以,你已經知道了:神秘的 1 不只是巧合,而是隱式型別轉換的結果。理解這種行為對於避免意外結果和編寫更健壯的程式碼至關重要。

以上是為什麼在 C 中列印函數名稱會導致“1”?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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