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

Mary-Kate Olsen
Lepaskan: 2024-10-25 07:37:29
asal
138 orang telah melayarinya

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
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!