Rumah > Artikel > pembangunan bahagian belakang > Mengapa Kod C Saya Memasuki Gelung Infinite Walaupun Tugasan Yang Nampak Tidak Memudaratkan?
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!