Rumah > pembangunan bahagian belakang > C++ > Mengapa Melepasi Integer Paling Negatif kepada Fungsi Terlebih Beban Menyebabkan Kekaburan dalam C?

Mengapa Melepasi Integer Paling Negatif kepada Fungsi Terlebih Beban Menyebabkan Kekaburan dalam C?

Linda Hamilton
Lepaskan: 2024-11-04 12:51:29
asal
691 orang telah melayarinya

Why Does Passing the Most Negative Integer to an Overloaded Function Cause Ambiguity in C  ?

Kekaburan dalam Resolusi Lebihan Beban untuk Integer Paling Negatif

Dalam C , lebihan fungsi membenarkan berbilang fungsi mempunyai nama yang sama tetapi jenis parameter berbeza. Walau bagaimanapun, apabila menyelesaikan panggilan fungsi terlampau beban, kekaburan boleh timbul jika pengkompil tidak dapat menentukan fungsi yang paling sesuai untuk digunakan.

Pertimbangkan kod berikut yang menunjukkan lebihan fungsi untuk memaparkan nilai integer dan integer tidak bertanda:

<code class="cpp">void display(int a) { cout << "int" << endl; }
void display(unsigned a) { cout << "unsigned" << endl; }
Salin selepas log masuk

Menurut pemahaman kami, sebarang nilai integer dalam julat yang ditentukan untuk int harus menggunakan paparan(int), manakala nilai di luar julat ini akan menyebabkan kekaburan. Walau bagaimanapun, apabila cuba menghantar nilai int paling negatif (-2147483648) untuk dipaparkan, pengkompil menimbulkan ralat:

call of overloaded display(long int) is ambiguous
Salin selepas log masuk

Tingkah laku yang mengejutkan ini berpunca daripada ketiadaan literal integer negatif dalam C . Literal integer yang ditakrifkan dalam piawai C tidak termasuk aksara '-'. Sebaliknya, apabila menemui '-' diikuti dengan nombor, pengkompil menganggapnya sebagai operator penolakan unary yang digunakan pada literal integer positif.

Dalam kes kami, '-2147483648' ditafsirkan sebagai '-1 * 2147483648'. Memandangkan '2147483648' melebihi julat int, ia dinaikkan pangkat kepada int yang panjang. Promosi jenis ini membawa kepada kekaburan kerana kini kedua-dua paparan(int) dan paparan(int panjang) adalah calon yang berdaya maju untuk panggilan fungsi.

Untuk mengelakkan kekaburan tersebut, adalah disyorkan untuk menggunakan kelas std::numeric_limits untuk dapatkan nilai minimum atau maksimum untuk jenis data yang berbeza dengan cara mudah alih:

<code class="cpp">std::cout << std::numeric_limits<int>::min() << endl;</code>
Salin selepas log masuk

Atas ialah kandungan terperinci Mengapa Melepasi Integer Paling Negatif kepada Fungsi Terlebih Beban Menyebabkan Kekaburan dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan