C's Most Vixing Parse
Dalam C , cara coretan kod dihuraikan boleh membawa kepada tingkah laku yang tidak dijangka. Satu contoh yang terkenal dikenali sebagai "penghuraian paling menjengkelkan."
Enigma Perisytiharan Fungsi
Pertimbangkan kod berikut:
widget w(gadget(), doodad());
Pada pandangan pertama, nampaknya mengisytiharkan pembolehubah bernama w jenis widget. Walau bagaimanapun, kod ini sebenarnya mentakrifkan fungsi bernama w yang mengambil dua argumen.
Peluruhan Argumen dan Hantaran Penunjuk
Dalam pengisytiharan fungsi, argumen jenis tatasusunan mereput menjadi penunjuk kepada elemen pertama, dan argumen jenis fungsi mereput menjadi penunjuk fungsi. Oleh itu, pengisytiharan setara w ialah:
widget w(gadget(*)(), doodad(*)());
Ini bermakna fungsi w mengambil sebagai hujah pertamanya penunjuk kepada fungsi yang tidak mengambil hujah dan mengembalikan alat. Ia juga memerlukan hujah kedua, penunjuk kepada fungsi yang tidak mengambil hujah dan mengembalikan doodad. Fungsi itu sendiri mengembalikan widget.
Kerumitan Tambahan
"Huraian yang paling menjengkelkan" menjadi lebih mengelirukan dalam kes seperti berikut:
widget w(gadget(x));
Jika x sudah menjadi pembolehubah, bagaimanakah ini boleh ditafsirkan sebagai pengisytiharan fungsi? Jawapannya terletak pada fakta bahawa dalam C , anda boleh menggunakan kurungan tambahan apabila mengisytiharkan pembolehubah. Oleh itu, alat x; dan alat (x); kedua-duanya mengisytiharkan pembolehubah yang sama bernama x. Oleh itu, kod di atas ialah pengisytiharan fungsi yang mengambil hujah pertama jenis alat bernama x dan mengembalikan widget.
Atas ialah kandungan terperinci Apakah C \'Paling Menjengkelkan Parse\' dan Bagaimana Ia Mengelirukan Perisytiharan Fungsi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!