Rumah >pembangunan bahagian belakang >C++ >Adakah `goto` Memintas Perlaksanaan Pemusnah dalam C ?

Adakah `goto` Memintas Perlaksanaan Pemusnah dalam C ?

Linda Hamilton
Linda Hamiltonasal
2024-12-01 04:52:14888semak imbas

Does `goto` Bypass Destructor Execution in C  ?

Bolehkah Goto Traverse Berfungsi Tanpa Menggunakan Pemusnah?

Salah tanggapan biasa berterusan yang goto melangkau bahagian kod, mengelakkan pelaksanaan pemusnah dan seumpamanya operasi. Salah faham ini amat ketara dalam perbincangan sekitar C .

Sekatan Skop

Bertentangan dengan kepercayaan popular, goto tidak boleh melintasi sempadan fungsi. Percubaan untuk melompat ke label yang ditakrifkan dalam fungsi yang berbeza mengakibatkan ralat pengkompil, seperti yang digambarkan di bawah:

void f() {
   int x = 0;
   goto lol;
}

int main() {
   f();
lol:
   return 0;
}

Ralat: label 'lol' digunakan tetapi tidak ditakrifkan

Objek Pertimbangan Permulaan

Melompat merentasi pemulaan objek juga tidak dibenarkan. Jika anda cuba melangkau pemulaan objek, pengkompil akan membenderakan ralat:

int main() {
   goto lol;
   int x = 0;
lol:
   return 0;
}

Ralat: lompat ke label 'lol'
Ralat: dari sini
Ralat: melintasi pemulaan 'int x'

Skop-Khusus Pemusnahan

Objek dengan tempoh penyimpanan automatik dimusnahkan apabila keluar dari skopnya, tanpa mengira kaedah keluar. Oleh itu, Goto tidak boleh memintas pemusnahan objek:

struct T {
   T() { cout << "*T"; }
  ~T() { cout << "~T"; }
};

int main() {
   {
      T t;
      goto lol;
   }

lol:
   return 0;
}

Output: *T~T

Sekatan Jenis Objek

Sambil melompat ke dalam skop objek bukan skalar secara amnya dilarang, terdapat pengecualian untuk objek dengan pembina lalai dan pemusnah remeh. Pengisytiharan tatasusunan tanpa pemula juga dikecualikan.

Kesimpulan

Goto, walaupun bukan celah yang memintas mekanisme skop C, boleh menyebabkan tingkah laku yang tidak diduga jika digunakan secara sembarangan. Namun begitu, sekatan yang digariskan di atas memberikan perlindungan terhadap penggunaan goto yang tidak disengajakan atau berbahaya. Oleh itu, ia tidak semestinya jahat seperti yang biasa dilihat tetapi harus digunakan dengan budi bicara.

Atas ialah kandungan terperinci Adakah `goto` Memintas Perlaksanaan Pemusnah dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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