Rumah >pembangunan bahagian belakang >C++ >Adakah `widget w(gadget(), doodad());` Pengisytiharan Pembolehubah atau Pengisytiharan Fungsi dalam 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
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(*)() );
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));
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!