Rumah >pembangunan bahagian belakang >C++ >Mengapa Kod C Saya Memasuki Gelung Infinite Walaupun Tugasan Yang Nampak Tidak Memudaratkan?

Mengapa Kod C Saya Memasuki Gelung Infinite Walaupun Tugasan Yang Nampak Tidak Memudaratkan?

Barbara Streisand
Barbara Streisandasal
2024-11-04 13:58:02478semak imbas

Why Does My C   Code Enter an Infinite Loop Despite a Seemingly Harmless Assignment?

Gelung Output Infinite dalam C

Dalam kod C yang disediakan, gelung tidak berkesudahan yang tidak dijangka berlaku, mencetak siri nombor berterusan ("0 , 1, 2, 3, 4, 5, ...") dan bukannya "0, 1, 2, 3" yang dijangkakan.

Pemeriksaan lebih dekat mendedahkan bahawa penyebabnya ialah pernyataan tugasan "delta" yang kelihatan tidak berbahaya = mc[di]" dalam gelung. Tugasan ini mencetuskan gelagat tidak ditentukan kerana ia mengakses tatasusunan mc di luar sempadan pada lelaran terakhir (iaitu, "di = 4").

Di bawah pengoptimuman gelung yang agresif, pengkompil mungkin menganggap ketiadaan gelagat tidak ditentukan. Akibatnya, ia mengoptimumkan gelung dengan menghapuskan di < 4 semak, membawa kepada pelaksanaan gelung berterusan.

Untuk memastikan gelagat yang betul, adalah penting untuk mengelakkan gelagat yang tidak ditentukan, walaupun dalam kod yang dioptimumkan. Dalam kes ini, penyelesaiannya adalah untuk memastikan bahawa mc diakses dalam sempadan dalam gelung.

Pendekatan alternatif ialah menggunakan bendera -fno-agressive-loop-optimizations dalam gcc untuk melumpuhkan pengoptimuman gelung agresif. Bendera ini memaksa pengkompil untuk mengekalkan di < 4 semak dan cegah gelagat yang tidak ditentukan yang membawa kepada gelung tak terhingga.

Dengan memahami kemungkinan akibat daripada tingkah laku yang tidak ditentukan dan mengambil langkah yang sesuai untuk mengelakkannya, pengaturcara boleh memastikan kebolehpercayaan dan ketepatan kod C mereka.

Atas ialah kandungan terperinci Mengapa Kod C Saya Memasuki Gelung Infinite Walaupun Tugasan Yang Nampak Tidak Memudaratkan?. 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