Memahami Kekaburan "Paling Menjengkelkan" dalam Pemula Seragam C
"penghuraian paling menjengkelkan" merujuk kepada kekaburan yang boleh timbul apabila menggunakan sintaks permulaan seragam dalam C 11. Kekaburan ini berlaku apabila tidak jelas sama ada ungkapan kod sedang memulakan objek atau memanggil fungsi yang mengembalikan objek.
Untuk menggambarkan kekaburan ini, pertimbangkan kod berikut:
<code class="cpp">#include <iostream> class Timer { public: Timer() {} }; int main() { // Case 1: Initializing an object auto dv = Timer(); // Case 2: Calling a function int time_keeper(Timer()); return 0; }</code>
Kes 1: Memulakan Objek
Dalam kes pertama, auto dv = Pemasa() memulakan objek jenis Pemasa dipanggil dv. Jenis dv disimpulkan sebagai Pemasa kerana kami menggunakan auto untuk mengisytiharkannya.
Kes 2: Memanggil Fungsi
Dalam kes kedua, int time_keeper(Pemasa ()) mengisytiharkan fungsi yang dipanggil time_keeper yang mengembalikan int dan mengambil sebagai hujahnya penunjuk kepada fungsi yang mengembalikan Pemasa dan tidak mengambil hujah.
Sebab mengapa hujah itu bukan Pemasa (*) () adalah yang berfungsi mereput kepada penunjuk apabila diluluskan sebagai hujah. Oleh itu, jenis penjaga_masa sebenarnya int(Pemasa(*)()).
Kekaburan ini boleh dielakkan dengan menyatakan secara eksplisit jenis pembolehubah yang dimulakan atau mengisytiharkan tandatangan fungsi secara eksplisit. Contohnya:
<code class="cpp">// Explicitly specify the type of the variable auto dv: Timer = Timer(); // Explicitly declare the function's signature int time_keeper(Timer (*)());</code>
Atas ialah kandungan terperinci Bilakah Permulaan Seragam C Menjadi \'Penghuraian Paling Menjengkelkan\'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!