Cette question découle de la suggestion selon laquelle la conversion en caractère non signé char est nécessaire avant d'appeler des fonctions de manipulation de caractères comme std::toupper et std::tolower. Cependant, le code de Bjarne Stroustrup semble utiliser ces fonctions sans conversion.
Représentation des caractères
Les caractères signés et non signés sont des types distincts en C . Char peut représenter une plage équivalente à un caractère signé ou à un caractère non signé. Dans les systèmes où char est signé, l'ensemble du jeu de caractères a des valeurs non négatives.
Fonction toupper
Selon la norme C, toupper accepte un argument int et renvoie un résultat int. La valeur d'entrée doit être représentable sous forme de caractère non signé ou égale à EOF. Sinon, le comportement est indéfini.
Comportement non défini
Si plain char est signé et que la valeur transmise à topper est négative, un comportement indéfini se produit. En effet, la conversion implicite en int donne une valeur négative.
Conversion en caractère non signé
La conversion de l'argument char en caractère non signé garantit que la valeur n'est pas négative. , en évitant un comportement indéfini. Même si les caractères et les caractères non signés ont la même taille, ils représentent des plages de valeurs différentes.
Implémentation
Ces fonctions sont généralement implémentées à l'aide de tables de recherche. L'indexation au-delà des limites de la table peut conduire à un comportement indéfini. La conversion directe en caractère non signé n'évite pas ce problème si le résultat est implicitement reconverti en une valeur négative.
Exception : EOF
Les fonctions dans
Modifications C
Le standard C ne modifie que certaines fonctions de la bibliothèque standard C, et aucun ajustement n'a été apporté aux fonctions dans
Conclusion
Pour éviter un comportement indéfini, il est nécessaire de convertir l'argument char en unsigned char avant d'appeler topper, tolower ou similaire fonctions, même si char est un type signé non négatif.
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!