計算一個不調用的函數:解開謎團
想像一下:你正在編碼,而不是調用帶括號的函數,您帶括號的函數,您只需列印它的名稱即可。令人驚訝的是,結果總是 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 << ≺ // 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中文網其他相關文章!