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() );
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(*)() );
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));
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!