Mengabaikan Penyata Pemulangan dalam C
Dalam C , adalah lazim untuk menamatkan fungsi tidak batal dengan penyata pulangan. Walau bagaimanapun, kejadian aneh telah diperhatikan dalam versi Windows tertentu g yang diedarkan dengan Strawberry Perl. Versi ini membenarkan peninggalan pernyataan pemulangan dalam fungsi yang mengembalikan nilai bukan batal, yang membawa kepada tingkah laku yang tidak dijangka.
Pertimbangkan fungsi ahli berikut:
struct boundTag Box::getBound(int side) { struct boundTag retBoundTag; retBoundTag.box = this; switch (side) { // set retBoundTag.bound based on value of "side" } }
Fungsi ini direka bentuk untuk kembalikan struktur yang mewakili tag terikat. Walau bagaimanapun, pembangun secara tidak sengaja telah meninggalkan penyata pemulangan:
// ... code from above }
Apabila menguji fungsi ini, pembangun menerima output yang sah walaupun penyataan pemulangan hilang. Walaupun selepas mengalih keluar penyataan pemulangan, kod itu menyusun tanpa sebarang amaran.
Isu yang mendasarinya ialah meninggalkan penyataan pemulangan dalam fungsi bukan batal menimbulkan gelagat yang tidak ditentukan. Piawaian ISO C -98 secara eksplisit menyatakan bahawa mengalir keluar dari hujung fungsi bukan lompang adalah bersamaan dengan pulangan tanpa nilai, mengakibatkan gelagat tidak ditentukan.
// ... code from above // Undefined behavior }
Dalam senario ini, g berkemungkinan mengembalikan a nilai sampah kerana pengkompil tidak dapat menentukan nilai pulangan yang dimaksudkan. Menggunakan nilai yang dikembalikan ini dalam kod anda adalah berbahaya dan boleh membawa kepada hasil yang tidak dapat diramalkan.
Walaupun g mungkin tidak mengeluarkan amaran secara lalai, menggunakan pilihan -Wall semasa penyusunan memaksa pengkompil untuk memberi amaran tentang kes ini. Pilihan ini akan menyerlahkan penyataan pulangan yang hilang dan membantu menghalang tingkah laku yang tidak ditentukan sedemikian.
Oleh itu, adalah penting untuk sentiasa memasukkan pernyataan pulangan dalam fungsi bukan batal, walaupun jika nilai pulangan tidak digunakan serta-merta. Amalan ini memastikan bahawa kod mematuhi piawaian C dan mengelakkan sebarang kemungkinan tingkah laku yang tidak ditentukan.
Atas ialah kandungan terperinci Mengapakah Meninggalkan Penyata Pemulangan dalam Fungsi Tidak Batal C Kadang-kadang Berfungsi (dan Mengapa Ia Tidak Sepatutnya)?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!