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

Patricia Arquette
Lepaskan: 2024-10-30 06:36:03
asal
161 orang telah melayarinya

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);
}
Salin selepas log masuk

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
Salin selepas log masuk

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()
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!