Rumah  >  Artikel  >  pembangunan bahagian belakang  >  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
Linda Hamiltonasal
2024-11-04 12:51:29625semak imbas

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; }

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

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>

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!

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