web-dev-qa-db-fra.com

Pourquoi l'alphabet est-il divisé en plusieurs plages dans ce code C?

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 Easter Egg 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'));
}
161
Vladimir Ch.

L'auteur de ce code devait probablement prendre en charge EBCDIC à un moment donné, où les valeurs numériques des lettres ne sont pas contiguës (des écarts existent entre I, J et R, S, comme vous l'avez peut-être deviné).

Il convient de noter que les normes C et C++ garantissent uniquement que les caractères 0 à 9 ont des valeurs numériques contiguës précisément pour cette raison, donc aucune de ces méthodes n'est strictement conforme aux normes.

214
Wintermute

Il semble 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++ do nécessitent que '0'-'9' sont contigus.

Notez que les bibliothèques standard appellent do savent si elles fonctionnent sur ASCII, EBCDIC ou d'autres systèmes, elles sont donc plus portables et peut-être plus efficaces.

54
MSalters