Rumah >pembangunan bahagian belakang >C++ >Mengapa Mencetak Penunjuk Fungsi Tanpa Invocation Menghasilkan \'1\' dalam C ?

Mengapa Mencetak Penunjuk Fungsi Tanpa Invocation Menghasilkan \'1\' dalam C ?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-10-25 07:37:29202semak imbas

Why Does Printing a Function Pointer Without Invocation Yield

Mencetak Penunjuk Fungsi Tanpa Invocation: Memahami Output Misterius 1

Dalam coretan kod yang menarik, fungsi "dipanggil" tanpa menggunakan tanda kurungnya ("pr;") dan kemudian dicetak menggunakan std::cout. Anehnya, hasilnya secara konsisten menghasilkan 1, mengingkari jangkaan.

Enigma Pemalar 1s

Kod memanggil fungsi pr tiga cara berbeza:

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

Gerak hati mencadangkan bahawa penuding fungsi harus dicetak dan bukannya 1 yang penuh teka-teki. Walau bagaimanapun, memahami tingkah laku ini memerlukan mendalami mekanisme penukaran jenis C.

Penukaran Jenis dan Nilai Bool

Apabila diluluskan sebagai hujah untuk dikira, pr secara tersirat ditukar kepada bool. Penukaran ini berlaku kerana bool ialah jenis asas, dan cout memerlukan jenis asas sebagai input. Dalam C , nilai bool yang ditukar adalah benar jika nilai asal bukan sifar dan palsu jika sifar.

Memandangkan pr ialah penunjuk fungsi, nilainya ialah alamat memori bukan sifar. Akibatnya, apabila ditukar kepada bool, ia dinilai kepada benar, iaitu output sebagai 1 oleh cout.

Menyesuaikan Pencetakan Penunjuk Fungsi (C 11 dan seterusnya)

C 11 memperkenalkan beban lampau yang boleh disesuaikan yang membolehkan pencetakan penuding fungsi yang lebih bermaklumat:

<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>

Lebih beban ini mencetak alamat penuding fungsi dan bilangan hujah yang diperlukan. Ia boleh digunakan untuk mencetak pr seperti berikut:

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

Pendekatan ini memberikan lebih banyak output deskriptif, menjadikannya lebih mudah untuk memahami sifat penuding fungsi.

Atas ialah kandungan terperinci Mengapa Mencetak Penunjuk Fungsi Tanpa Invocation Menghasilkan \'1\' dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn