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

Adakah `goto` Memintas Perlaksanaan Pemusnah dalam C ?

Linda Hamilton
Lepaskan: 2024-12-01 04:52:14
asal
975 orang telah melayarinya

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;
}
Salin selepas log masuk

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;
}
Salin selepas log masuk

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;
}
Salin selepas log masuk

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!

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