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!