Dans une bibliothèque personnalisée, j'ai vu une implémentation:
inline int is_upper_alpha(char chValue)
{
if (((chValue >= 'A') && (chValue <= 'I')) ||
((chValue >= 'J') && (chValue <= 'R')) ||
((chValue >= 'S') && (chValue <= 'Z')))
return 1;
return 0;
}
Est-ce un œuf de Pâques ou quels sont les avantages par rapport à la méthode C / C ++ standard?
inline int is_upper_alpha(char chValue)
{
return ((chValue >= 'A') && (chValue <= 'Z'));
}
'J' - 'I'
et les'S' - 'R'
deux sont égaux1
, alors je m'attends à ce qu'un optimiseur raisonnable transforme le premier en le second.Réponses:
L'auteur de ce code avait sans doute pour soutenir EBCDIC à un moment donné, où les valeurs numériques des lettres sont non contiguës (lacunes existent entre
I
,J
etR
,S
comme vous l'aurez deviné).Il est intéressant de noter que le C et les normes C de seulement la garantie que les caractères
0
à9
avoir des valeurs numériques contiguës précisément pour cette raison, si aucune de ces méthodes est strictement conforme à la norme.la source
// In the EBCDIC coding, the alphabet has gaps between these values. See URL: xxxx for details
. Alors vous n'aurez même jamais à poser la question. Vous auriez la réponse intégrée au code.return ( isalpha( chValue ) && isupper( chValue ) )
...On dirait qu'il tente de couvrir à la fois EBCDIC et ASCII. Votre méthode alternative ne fonctionne pas pour EBCDIC (elle a des faux positifs, mais pas de faux négatifs)
C et C ++ ne nécessitent que
'0'-'9'
sont contiguës.Notez que les appels bibliothèque standard ne sait si elles fonctionnent sur ASCII, EBCDIC ou d' autres systèmes, ils sont donc plus portable et peut - être plus efficace.
la source
std::isupper
interroge en fait la locale C globale actuellement installée.'A'
doit rester'A'
indépendamment de la localisation. ASCII à UTF-8, ce serait possible.std::isupper
interroge la locale C globale actuellement installée, oui, mais pas la phase de compilation qui interprète les caractères littéraux.std::isupper
c'est vraiment nécessaire dans la plupart des cas. Il respecte les paramètres régionaux utilisés pour les entrées de l'utilisateur. Mais lors de l'analyse des fichiers, de l'interaction avec les bases de données, vous attendez généralement d'autres paramètres régionaux. De plus, au moins sous Linux, ces appels liés à la locale sont très lents - par exemple,std::isalpha
appelle dynamic_cast deux fois pour "trouver" l'implémentation appropriée de la locale avant de comparer un seul caractère.