Output Gelung Tanpa Kesudahan yang Tidak Dijangka: A Gotcha dalam Kompilasi C
Dalam C , operasi tertentu yang kelihatan tidak berbahaya boleh membawa kepada tingkah laku yang tidak dijangka, seperti yang ditunjukkan oleh kod berikut coretan:
<code class="cpp">#include <iostream> #include <complex> using namespace std; int main() { complex<int> delta; complex<int> mc[4] = {0}; for (int di = 0; di < 4; di++, delta = mc[di]) { cout << di << endl; } return 0; }</code>
Bertentangan dengan output yang dijangkakan bagi "0, 1, 2, 3," kod tersebut tersilap menghasilkan siri nombor yang tidak berkesudahan. Tingkah laku yang membingungkan ini berpunca daripada isu halus namun penting yang berkaitan dengan tingkah laku yang tidak ditentukan.
Teka-teki Tingkah Laku Tidak Tertakrif
Pernyataan tugasan delta = mc[di] mengakses tatasusunan mc melebihi indeksnya yang sah pada lelaran terakhir gelung. Dalam alam C , mengakses memori di luar sempadan membentuk tingkah laku yang tidak ditentukan, alam di mana hasil yang tidak dapat diramalkan berkuasa.
Pengoptimuman Gelung Agresif: Pedang Bermata Dua
Penyusun sering menggunakan pengoptimuman gelung yang agresif untuk meningkatkan prestasi. Pengoptimuman ini memanfaatkan andaian tentang ketiadaan gelagat yang tidak ditentukan. Dalam kes kod yang diberikan, pengkompil boleh menyimpulkan bahawa di < 4 sentiasa berlaku, tanpa mengira sempadan tatasusunan sebenar, berdasarkan anggapan bahawa tingkah laku yang tidak ditentukan tidak akan berlaku. Andaian ini, seterusnya, mengalih keluar semakan sempadan, membenarkan gelung berulang selama-lamanya.
Merungkai Misteri
GCC dengan pengoptimuman didayakan dan tanpa -fno-agressive -gelung-pengoptimuman bendera mempamerkan kelakuan gelung tak terhingga. Walau bagaimanapun, dengan bendera itu didayakan, tingkah laku yang salah hilang. Memeriksa kod pemasangan mendedahkan bahawa di < 4 cek telah dialih keluar dan digantikan dengan lompatan tanpa syarat.
Mengelakkan Perangkap
Untuk melindungi daripada perangkap sedemikian, adalah penting untuk mengelakkan tingkah laku yang tidak ditentukan dan menyemak secara jelas sempadan tatasusunan. Selain itu, memastikan mesej diagnostik yang sesuai melalui bendera amaran boleh memberikan cerapan berharga tentang isu yang berpotensi.
Kesimpulan
Tingkah laku yang tidak ditentukan boleh membawa kepada tingkah laku yang tidak dijangka dan tidak dapat diramalkan dalam kod C. Adalah penting untuk mengetahui potensi perangkap sedemikian dan dengan tekun mematuhi amalan pengaturcaraan yang baik untuk mengelakkan hasil yang tidak dijangka.
Atas ialah kandungan terperinci Mengapa Kod C Ini Menghasilkan Gelung Tak Terhingga Daripada Keluaran Mudah?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!