Maison > développement back-end > C++ > le corps du texte

Pourquoi le passage de la valeur entière la plus négative à une fonction surchargée en C entraîne-t-il une erreur d'ambiguïté, même si l'impression directe de la valeur fonctionne correctement ?

Patricia Arquette
Libérer: 2024-10-31 21:24:02
original
788 Les gens l'ont consulté

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?

Surcharge de fonctions ambiguë pour la valeur entière la plus négative

En C, la surcharge de fonctions autorise plusieurs fonctions avec le même nom mais des paramètres différents. Cependant, une ambiguïté surgit lorsque le compilateur ne peut pas déterminer quelle fonction surchargée appeler en fonction des arguments donnés. Ce problème peut survenir lorsque vous travaillez avec des types entiers, en particulier lorsqu'il s'agit de la valeur la plus négative.

Considérez l'extrait de code suivant :

<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);
}
Copier après la connexion

Selon notre compréhension de la surcharge de fonctions, toute valeur dans la plage entière (4 octets dans ce cas), il faut appeler la fonction display(int). Des valeurs en dehors de cette plage entraîneraient une ambiguïté. Cependant, la compilation de ce code entraîne l'erreur suivante :

call of overloaded `display(long int)` is ambiguous
Copier après la connexion

Cette erreur survient lors du passage de la valeur entière la plus négative (-2147483648) à la fonction d'affichage. Étrangement, imprimer directement la même valeur (comme on le voit à la ligne 6) produit le résultat correct : -2147483648.

La subtilité : manque de littéraux négatifs en C

Le la clé pour comprendre ce comportement réside dans l’absence de littéraux négatifs en C . Tous les littéraux entiers en C sont considérés comme non signés par défaut, ce qui signifie qu'ils n'ont pas de préfixe de signe (- ou ). En conséquence, -2147483648 est en fait traité comme -1 * (2147483648).

Implications pour les fonctions surchargées

Puisque 2147483648 dépasse la plage d'un entier (4 octets ), il est promu en entier long. Cela signifie que le compilateur tente d'appeler la fonction display(long int), ce qui entre en conflit avec la surcharge display(int) existante. Par conséquent, l'ambiguïté surgit.

Résolution

Pour éviter cette ambiguïté, il est recommandé d'utiliser la classe std::numeric_limits pour obtenir les valeurs minimales et maximales spécifiques au type. :

<code class="c++">std::cout << std::numeric_limits<int>::min() << endl; // displays -2147483648</code>
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!