Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Kod C Ini Menghasilkan Gelung Tak Terhingga Daripada Keluaran Mudah?

Mengapa Kod C Ini Menghasilkan Gelung Tak Terhingga Daripada Keluaran Mudah?

DDD
DDDasal
2024-11-01 11:22:31976semak imbas

Why Does This C   Code Result in an Infinite Loop Instead of a Simple Output?

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!

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