Rumah >pembangunan bahagian belakang >C++ >Mengapa Gelung Ini Melimpah dan Menghasilkan Output Tidak Dijangka?

Mengapa Gelung Ini Melimpah dan Menghasilkan Output Tidak Dijangka?

DDD
DDDasal
2024-12-02 18:11:19258semak imbas

Why Does This Loop Overflow and Produce Unexpected Output?

Mengapakah gelung ini menghasilkan "amaran: lelaran 3u memanggil gelagat tidak ditentukan" dan mengeluarkan lebih daripada 4 baris?

Kod yang dimaksudkan:

#include <iostream>

int main()
{
    for (int i = 0; i < 4; ++i)
        std::cout << i * 1000000000 << std::endl;
}

menjana amaran berikut:

warning: iteration 3u invokes undefined behavior [-Waggressive-loop-optimizations]
   std::cout << i * 1000000000 << std::endl;
                  ^

Ini amaran berpunca daripada limpahan integer bertanda yang berlaku dalam pernyataan:

i * 1000000000

Pendaraban i (jenis data int) dengan 1000000000 mengakibatkan limpahan integer kerana 1000000000 terlalu besar untuk dimuatkan dalam julat pembolehubah int. Akibatnya, nilai i menjadi tidak ditentukan dan sebarang operasi seterusnya pada i (seperti mengeluarkannya ke konsol) mungkin menghasilkan hasil yang tidak dijangka.

Dalam kes khusus ini, gelung terus berulang dan menghasilkan output melebihi yang dimaksudkan empat lelaran kerana keadaan gelung i < 4 menilai kepada benar. Walau bagaimanapun, disebabkan limpahan integer, nilai i telah rosak dan gelung terus berulang sehingga penimbal output penuh.

Untuk menyelesaikan isu ini, anda mesti sama ada melaraskan syarat penamatan gelung untuk mengambil kira limpahan atau gunakan jenis data integer yang cukup lebar untuk mengendalikan hasil pendaraban.

Atas ialah kandungan terperinci Mengapa Gelung Ini Melimpah dan Menghasilkan Output Tidak Dijangka?. 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