Adakah `widget w(gadget(), doodad());` Pengisytiharan Pembolehubah atau Pengisytiharan Fungsi dalam C ?

Barbara Streisand
Lepaskan: 2024-11-19 08:43:03
asal
699 orang telah melayarinya

Is `widget w(gadget(), doodad());` a Variable Declaration or a Function Declaration in C  ?

C's Most Vixing Parse: Membongkar Misteri Pengisytiharan Fungsi

Sambil memahami sintaks widget w(); adalah mudah, ramai pengaturcara bergelut untuk memahami bagaimana serpihan kod berikut mewakili pengisytiharan fungsi:

widget w( gadget(), doodad() ); // pitfall: not a variable declaration
Salin selepas log masuk

Untuk membongkar misteri ini, adalah penting untuk menyelidiki peraturan pereputan C . Dalam pengisytiharan fungsi, argumen jenis tatasusunan merosot menjadi penunjuk yang menunjuk ke elemen pertama, manakala argumen jenis fungsi bertukar menjadi penunjuk fungsi.

Menggunakan prinsip ini, kod yang disebutkan di atas bertukar menjadi tandatangan berikut:

widget w( gadget(*)(), doodad(*)() );
Salin selepas log masuk

Ini menunjukkan fungsi yang menerima dua argumen: penunjuk ke fungsi yang tidak mengambil argumen dan mengembalikan jenis alat, dan penunjuk kepada fungsi yang turut mengambil sifar hujah dan mengembalikan jenis doodad. Fungsi itu sendiri mengembalikan widget.

Kerumitan tidak berakhir di situ. Pertimbangkan contoh yang membingungkan ini:

widget w(gadget(x));
Salin selepas log masuk

Bagaimana ini boleh menjadi pengisytiharan fungsi memandangkan x ialah pembolehubah?

Dalam C , ia dibenarkan untuk memasukkan tanda kurungan tambahan semasa mengisytiharkan pembolehubah, seperti alat x; dan gajet (x);. Ini terpakai pada argumen fungsi juga, membenarkan kod di atas ditafsirkan sebagai pengisytiharan fungsi yang mengambil satu argumen bernama x jenis alat dan mengembalikan widget.

Atas ialah kandungan terperinci Adakah `widget w(gadget(), doodad());` Pengisytiharan Pembolehubah atau Pengisytiharan Fungsi 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