Rumah > pembangunan bahagian belakang > C++ > Apakah Parse C Paling Menjengkelkan dan Mengapa Ia Mentafsir `A a(A());` sebagai Pengisytiharan Fungsi?

Apakah Parse C Paling Menjengkelkan dan Mengapa Ia Mentafsir `A a(A());` sebagai Pengisytiharan Fungsi?

Barbara Streisand
Lepaskan: 2024-12-21 05:40:09
asal
893 orang telah melayarinya

What is the C   Most Vexing Parse and Why Does It Interpret `A a(A());` as a Function Declaration?

Penghuraian Paling Menjengkelkan: Teka-teki dalam Sintaks C

Dalam dunia labirin sintaks C, satu teka-teki yang membingungkan menonjol: yang Paling Penghuraian Menjengkelkan (MVP). Keanehan sintaksis ini menimbulkan cabaran kepada pengaturcara, menyebabkan ramai yang bingung.

Inti MVP terletak pada tafsiran samar-samar sintaks tertentu:

A a( A() );
Salin selepas log masuk

Baris yang membingungkan ini boleh ditafsirkan dalam dua bercanggah cara:

  1. Takrifan Pembolehubah: Pembolehubah 'a' kelas 'A' ditakrifkan, mengambil contoh tanpa nama kelas 'A' sebagai nilainya.
  2. Pengisytiharan Fungsi: Fungsi 'a' diisytiharkan, yang mengembalikan objek jenis 'A' dan mengambil satu hujah tanpa nama yang merupakan fungsi mengembalikan 'A' dan tidak mengambil input.

Anehnya, walaupun jangkaan pengaturcara yang lazim bahawa tafsiran pertama adalah betul, piawaian C mewajibkan tafsiran kedua. Ini menyebabkan ramai yang menggaru kepala, tertanya-tanya mengapa pilihan yang tidak dijangka dan berkemungkinan mengelirukan telah dibuat.

Untuk memahami rasional di sebalik MVP, mari kita pertimbangkan senario hipotetikal di mana ia tidak wujud. Dalam realiti alternatif ini, bagaimanakah fungsi diisytiharkan dalam C ?

A foo();
Salin selepas log masuk

Malangnya, menggunakan sintaks ini menghasilkan takrifan berubah-ubah dan bukannya pengisytiharan kaedah. Untuk menampung pengisytiharan fungsi, kata kunci baharu atau sintaks yang janggal akan diperlukan.

Untuk mengelakkan kerumitan sedemikian, piawaian C memilih peraturan yang lebih mudah: "Semua yang boleh ditafsirkan sebagai pengisytiharan akan ditafsirkan sebagai pengisytiharan." Ini merangkumi kedua-dua definisi pembolehubah dan pengisytiharan fungsi. Oleh itu, sintaks

A a;
Salin selepas log masuk

mentakrifkan pembolehubah, manakala

A a();
Salin selepas log masuk

mengisytiharkan fungsi.

Mengguna pakai peraturan ini memastikan konsistensi dalam sintaks, menghapuskan keperluan untuk kes khas. Walaupun ini pada mulanya mungkin mengelirukan pengaturcara, ia akhirnya menggalakkan kejelasan dan konsistensi dalam bahasa.

Atas ialah kandungan terperinci Apakah Parse C Paling Menjengkelkan dan Mengapa Ia Mentafsir `A a(A());` sebagai Pengisytiharan 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