Lebihan Fungsi Samar-samar untuk Nilai Integer Paling Negatif
Dalam C , lebihan fungsi membenarkan berbilang fungsi dengan nama yang sama tetapi parameter berbeza. Walau bagaimanapun, kekaburan timbul apabila pengkompil tidak dapat menentukan fungsi terlampau beban untuk digunakan berdasarkan hujah yang diberikan. Isu ini boleh berlaku apabila bekerja dengan jenis integer, terutamanya apabila berurusan dengan nilai paling negatif.
Pertimbangkan coretan kod berikut:
<code class="c++">void display(int a) { cout << "int" << endl; } void display(unsigned a) { cout << "unsigned" << endl; } int main() { int i = -2147483648; cout << i << endl; //will display -2147483648 display(-2147483648); }
Menurut pemahaman kami tentang lebihan muatan, sebarang nilai dalam julat integer (4 bait dalam kes ini) harus menggunakan fungsi paparan(int). Nilai di luar julat ini akan membawa kepada kekaburan. Walau bagaimanapun, menyusun kod ini menghasilkan ralat berikut:
call of overloaded `display(long int)` is ambiguous
Ralat ini timbul apabila menghantar nilai integer paling negatif (-2147483648) kepada fungsi paparan. Anehnya, mencetak nilai yang sama secara langsung (seperti yang dilihat pada baris 6) menghasilkan hasil yang betul: -2147483648.
Kehalusan: Kekurangan Huruf Negatif dalam C
The kunci untuk memahami tingkah laku ini terletak pada ketiadaan literal negatif dalam C . Semua literal integer dalam C dianggap sebagai tidak ditandatangani secara lalai, bermakna ia tidak mempunyai awalan tanda (- atau ). Akibatnya, -2147483648 sebenarnya dianggap sebagai -1 * (2147483648).
Implikasi untuk Fungsi Terlebih Beban
Sejak 2147483648 integer (4 bytes integer melebihi julat anteger ), ia dinaikkan pangkat kepada integer panjang. Ini bermakna bahawa pengkompil cuba menggunakan fungsi paparan(int panjang), yang bercanggah dengan beban paparan(int) sedia ada. Oleh itu, kekaburan timbul.
Resolusi
Untuk mengelakkan kekaburan ini, adalah disyorkan untuk menggunakan kelas std::numeric_limits untuk mendapatkan nilai minimum dan maksimum khusus jenis :
<code class="c++">std::cout << std::numeric_limits<int>::min() << endl; // displays -2147483648</code>
Atas ialah kandungan terperinci Mengapakah menghantar nilai integer paling negatif kepada fungsi terlampau beban dalam C membawa kepada ralat kekaburan, walaupun mencetak nilai secara langsung berfungsi dengan betul?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!