首頁  >  文章  >  後端開發  >  為什麼將最大負整數值傳遞給 C 中的重載函數會導致歧義錯誤,即使直接列印該值可以正常運作?

為什麼將最大負整數值傳遞給 C 中的重載函數會導致歧義錯誤,即使直接列印該值可以正常運作?

Patricia Arquette
Patricia Arquette原創
2024-10-31 21:24:02786瀏覽

Why does passing the most negative integer value to an overloaded function in C   lead to an ambiguity error, even though printing the value directly works correctly?

最大負整數值的模糊函數重載

在C 中,函數重載允許多個具有相同名稱但不同參數的函數。但是,當編譯器無法根據給定參數確定要呼叫哪個重載函數時,就會出現歧義。使用整數類型時,尤其是在處理最大負值時,可能會發生此問題。

考慮以下程式碼片段:

<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);
}

根據我們對函數重載的理解,任何值在整數範圍內(本例中為4 位元組)應呼叫display(int)函數。超出此範圍的值會導致歧義。但是,編譯此程式碼會導致下列錯誤:

call of overloaded `display(long int)` is ambiguous

將最大負整數值 (-2147483648) 傳遞給顯示函數時會出現此錯誤。奇怪的是,直接列印相同的值(如第 6 行所示)會產生正確的結果:-2147483648。

微妙之處:C 中缺乏負文字

The理解這種行為的關鍵在於 C 中沒有負文字。預設情況下,C 中的所有整數文字都被視為無符號,這表示它們沒有符號前綴(- 或 )。結果,-2147483648 實際上被視為 -1 * (2147483648)。

重載函數的意義

由於 2147483648 超出了整數範圍(4 個位元組) ),它被提升為長整數。這意味著編譯器嘗試呼叫 display(long int) 函數,這與現有的 display(int) 重載衝突。因此,出現了歧義。

為了避免這種歧義,建議使用std::numeric_limits 類別來取得特定於類型的最小值和最大值:

<code class="c++">std::cout << std::numeric_limits<int>::min() << endl; // displays -2147483648</code>

以上是為什麼將最大負整數值傳遞給 C 中的重載函數會導致歧義錯誤,即使直接列印該值可以正常運作?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn