Mengapa Mencetak Nama Fungsi dalam C Menghasilkan \'1\'?

Patricia Arquette
Lepaskan: 2024-10-26 03:40:03
asal
725 orang telah melayarinya

Why Does Printing a Function Name in C   Result in

menyebut Fungsi Tanpa Memanggil: Membongkar Misteri

Bayangkan ini: anda sedang mengekod dan bukannya menggunakan fungsi dengan kurungan, anda hanya mencetak namanya. Yang menghairankan, hasilnya sentiasa 1. Pendekatan yang tidak konvensional ini membuatkan anda bingung, tentang 1 dan ketiadaan penunjuk fungsi yang dijangkakan.

Mari kita mendalami selok-belok kod anda:

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

Bertentangan dengan niat anda, anda sebenarnya tidak memanggil fungsi pr dalam cout<< kenyataan. Sebaliknya, anda menghantar penunjuk fungsinya kepada cout. Ini menyebabkan pr ditukar secara tersirat kepada nilai Boolean, menghasilkan 1s di mana-mana dalam output anda.

Untuk meningkatkan pemahaman anda, pertimbangkan untuk menggunakan cout << boolalpha sebelum dicetak. Ini akan memaparkan benar dan bukannya 1, mengukuhkan sifat Boolean output.

Sementara C 11 menawarkan penyelesaian yang elegan:

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

Lebih beban ini membolehkan anda mencetak penunjuk fungsi arity arbitrari , memaparkan maklumat seperti alamat penuding fungsi dan bilangan hujahnya.

Jadi, anda mempunyainya: 1 yang membingungkan bukan kebetulan semata-mata tetapi hasil daripada penukaran jenis tersirat. Memahami tingkah laku ini adalah penting untuk mengelakkan hasil yang tidak dijangka dan mencipta kod yang lebih mantap.

Atas ialah kandungan terperinci Mengapa Mencetak Nama Fungsi dalam C Menghasilkan \'1\'?. 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!