Heim  >  Artikel  >  Backend-Entwicklung  >  Warum führt die Übergabe des negativsten ganzzahligen Werts an eine überladene Funktion in C zu einem Mehrdeutigkeitsfehler, obwohl das direkte Drucken des Werts korrekt funktioniert?

Warum führt die Übergabe des negativsten ganzzahligen Werts an eine überladene Funktion in C zu einem Mehrdeutigkeitsfehler, obwohl das direkte Drucken des Werts korrekt funktioniert?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-31 21:24:02786Durchsuche

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?

Mehrdeutige Funktionsüberladung für den negativsten ganzzahligen Wert

In C ermöglicht die Funktionsüberladung mehrere Funktionen mit demselben Namen, aber unterschiedlichen Parametern. Es entsteht jedoch Unklarheit, wenn der Compiler anhand der angegebenen Argumente nicht bestimmen kann, welche überladene Funktion aufgerufen werden soll. Dieses Problem kann bei der Arbeit mit Ganzzahltypen auftreten, insbesondere beim Umgang mit dem negativsten Wert.

Beachten Sie den folgenden Codeausschnitt:

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

Nach unserem Verständnis von Funktionsüberladung jeder Wert innerhalb des Ganzzahlbereichs (in diesem Fall 4 Bytes) sollte die Funktion display(int) aufrufen. Werte außerhalb dieses Bereichs würden zu Unklarheiten führen. Das Kompilieren dieses Codes führt jedoch zu folgendem Fehler:

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

Dieser Fehler tritt auf, wenn der negativste ganzzahlige Wert (-2147483648) an die Anzeigefunktion übergeben wird. Seltsamerweise führt das direkte Drucken desselben Werts (wie in Zeile 6 zu sehen) zum korrekten Ergebnis: -2147483648.

Die Subtilität: Mangel an negativen Literalen in C

The Der Schlüssel zum Verständnis dieses Verhaltens liegt im Fehlen negativer Literale in C. Alle ganzzahligen Literale in C werden standardmäßig als vorzeichenlos betrachtet, was bedeutet, dass sie kein Vorzeichenpräfix (- oder ) haben. Infolgedessen wird -2147483648 tatsächlich als -1 * (2147483648) behandelt.

Auswirkungen auf überladene Funktionen

Da 2147483648 den Bereich einer Ganzzahl (4 Bytes) überschreitet ), wird es zu einer langen Ganzzahl heraufgestuft. Dies bedeutet, dass der Compiler versucht, die Funktion display(long int) aufzurufen, was zu einem Konflikt mit der vorhandenen Überladung display(int) führt. Daher entsteht die Mehrdeutigkeit.

Auflösung

Um diese Mehrdeutigkeit zu vermeiden, wird empfohlen, die Klasse std::numeric_limits zu verwenden, um typspezifische Minimal- und Maximalwerte zu erhalten :

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

Das obige ist der detaillierte Inhalt vonWarum führt die Übergabe des negativsten ganzzahligen Werts an eine überladene Funktion in C zu einem Mehrdeutigkeitsfehler, obwohl das direkte Drucken des Werts korrekt funktioniert?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn