Lebihan Fungsi Samar-samar dengan Huruf Integer Negatif
Dalam C , lebihan fungsi membenarkan berbilang fungsi dengan nama yang sama tetapi tandatangan berbeza. Walau bagaimanapun, senario tertentu boleh menyebabkan lebihan fungsi yang tidak jelas, mengakibatkan ralat penyusunan. Tingkah laku ini amat menarik apabila berurusan dengan nilai integer paling negatif.
Pertimbangkan kod berikut:
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); }
Seperti yang dijangka, panggilan untuk cout berjaya mencetak nilai i sebagai -2147483648 . Walau bagaimanapun, panggilan untuk memaparkan(-2147483648) menghadapi ralat:
call of overloaded display(long int) is ambiguous
Menariknya, tingkah laku ini adalah unik kepada nilai integer yang paling negatif, dan kekaburan timbul disebabkan oleh ciri menarik literal integer dalam C . Dalam C , literal integer negatif tidak wujud sebagai entiti bebas. Sebaliknya, ia dinyatakan sebagai operator tolak unari (-) yang digunakan pada literal integer positif. Ini bermakna -2147483648 ditafsirkan sebagai -1 * 2147483648.
Memandangkan 2147483648 melebihi julat int, ia dinaikkan pangkat kepada int panjang semasa penilaian. Akibatnya, apabila pengkompil cuba menyelesaikan panggilan fungsi, ia menghadapi dua beban lampau yang berpotensi berdaya maju:
Kekaburan ini mengakibatkan ralat penyusunan.
Untuk menyelesaikan isu ini dan memastikan tingkah laku yang dimaksudkan, adalah disyorkan untuk menggunakan utiliti std::numeric_limits untuk mendapatkan nilai minimum atau maksimum untuk jenis tertentu dengan cara mudah alih dan tidak jelas:
std::numeric_limits<int>::min(); // or max()
Atas ialah kandungan terperinci Mengapa Lebihan Fungsi Menjadi Samar-samar Apabila Menggunakan Nilai Integer Paling Negatif dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!