Rumah >pembangunan bahagian belakang >C++ >Mengapa Lebihan Fungsi Menjadi Samar-samar Apabila Menggunakan Nilai Integer Paling Negatif dalam C?

Mengapa Lebihan Fungsi Menjadi Samar-samar Apabila Menggunakan Nilai Integer Paling Negatif dalam C?

Patricia Arquette
Patricia Arquetteasal
2024-10-30 06:36:03206semak imbas

Why Does Function Overloading Become Ambiguous When Using the Most Negative Integer Value in C  ?

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:

  • display(int) dengan -1 sebagai hujah
  • display(long int) dengan 2147483648 sebagai hujah

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!

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