Kekaburan Pemuatan Terlebih Fungsi dengan Integer Paling Negatif
Dalam C , lebihan fungsi membenarkan berbilang fungsi dengan nama yang sama tetapi senarai parameter yang berbeza. Walau bagaimanapun, menghadapi nilai integer paling negatif boleh mengakibatkan ralat kekaburan disebabkan oleh penukaran jenis tersirat.
Memahami Isu
Coretan kod berikut menunjukkan isu:
<code class="cpp">void display(int a) { cout << "int" << endl; } void display(unsigned a) { cout << "unsigned" << endl; } int main() { int i = -2147483648; cout << i << endl; // prints -2147483648 display(-2147483648); // error: ambiguous function call }
Apabila integer paling negatif (-2147483648) dihantar ke paparan(-2147483648), pengkompil menjana ralat "lebihan fungsi samar-samar". Ini berlaku kerana pengkompil tidak dapat menentukan fungsi yang hendak dipanggil: display(int) atau display(unsigned).
Peranan Integer Literal
Gelagat yang diperhatikan dalam contoh yang diberikan berpunca daripada ketiadaan literal integer negatif dalam C . Literal integer mesti bermula dengan digit bukan sifar. Dalam kes -2147483648, tanda negatif ditafsirkan sebagai operator tolak unari, menghasilkan ungkapan -1 * (2147483648).
Taip Promosi
Sejak 2147483648 melebihi julat int, ia dinaikkan pangkat kepada int panjang. Walau bagaimanapun, promosi ini mewujudkan kesamaran antara jenis parameter paparan(int) dan paparan(tidak ditandatangani), yang membawa kepada ralat.
Penyelesaian Mudah Alih
Untuk mendapatkan nilai minimum atau maksimum untuk sesuatu jenis dalam cara mudah alih, seseorang boleh menggunakan:
<code class="cpp">std::numeric_limits<type>::min(); // or max()</code>
Dengan menggunakan kaedah ini, lebihan fungsi samar-samar dielakkan, memastikan pengendalian jenis yang betul tanpa mengira pelaksanaannya.
Atas ialah kandungan terperinci Mengapa Pemuatan Lebihan Fungsi Menjadi Kabur dengan Integer Paling Negatif dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!