Rumah > pembangunan bahagian belakang > C++ > Mengapakah C \'Paling Menjengkelkan Menghuraikan\' Salah Mentafsir Perisytiharan Pembolehubah sebagai Perisytiharan Fungsi?

Mengapakah C \'Paling Menjengkelkan Menghuraikan\' Salah Mentafsir Perisytiharan Pembolehubah sebagai Perisytiharan Fungsi?

Barbara Streisand
Lepaskan: 2024-12-01 13:12:12
asal
336 orang telah melayarinya

Why Does C  's

C's Most Vexing Parse Dilawati Semula

Fenomena "most vexing parse" yang terkenal dalam C timbul apabila pernyataan yang kelihatan tidak berbahaya boleh ditafsirkan sama ada sebagai pengisytiharan fungsi atau pengisytiharan berubah-ubah. Ini boleh membawa kepada tingkah laku yang tidak dijangka dan ralat yang sukar dinyahpepijat.

Salah satu contoh klasik ialah coretan kod:

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

Pada pandangan pertama, ini nampaknya merupakan pengisytiharan berubah-ubah untuk widget bernama w dengan pemula dalam kurungan. Walau bagaimanapun, apabila diperiksa dengan lebih teliti, kami menyedari bahawa gadget() dan doodad() ialah panggilan fungsi, menjadikan pernyataan itu sebagai pengisytiharan fungsi.

Kekaburan timbul kerana argumen fungsi jenis tatasusunan mereput menjadi penunjuk kepada elemen pertamanya, manakala hujah fungsi jenis fungsi mereput menjadi penunjuk fungsi. Ini bermakna tandatangan fungsi di atas sebenarnya:

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

Dalam erti kata lain, ia memerlukan dua penunjuk fungsi sebagai hujah dan mengembalikan widget.

Kes yang lebih membingungkan timbul apabila pembolehubah terlibat:

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

Memandangkan x ialah pembolehubah, nampaknya mustahil untuk mentafsir ini sebagai pengisytiharan fungsi. Walau bagaimanapun, C membenarkan kurungan tambahan dalam pengisytiharan berubah-ubah. Oleh itu, kedua-dua alat x; dan alat (x); isytiharkan pembolehubah yang sama x.

Oleh itu, kod di atas boleh dihuraikan sebagai pengisytiharan fungsi yang mengambil satu hujah jenis alat bernama x dan mengembalikan widget. Ini menunjukkan kepentingan memahami selok-belok sintaks C untuk mengelakkan perangkap halus ini.

Atas ialah kandungan terperinci Mengapakah C \'Paling Menjengkelkan Menghuraikan\' Salah Mentafsir Perisytiharan Pembolehubah sebagai Perisytiharan Fungsi?. 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