Rumah >pembangunan bahagian belakang >C++ >Mengapa Mencetak Penunjuk Fungsi Tanpa Invocation Menghasilkan \'1\' dalam C ?
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 << ≺ // 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!