¿Por qué el alfabeto se divide en múltiples rangos en este código C?


En una biblioteca personalizada vi una implementación:

inline int is_upper_alpha(char chValue)
{
    if (((chValue >= 'A') && (chValue <= 'I')) ||
        ((chValue >= 'J') && (chValue <= 'R')) ||
        ((chValue >= 'S') && (chValue <= 'Z')))
        return 1;
    return 0;
}

¿Es eso un Huevo de Pascua o cuáles son las ventajas frente al método estándar de C/C++?

inline int is_upper_alpha(char chValue)
{
    return ((chValue >= 'A') && (chValue <= 'Z'));
}
Author: Peter Mortensen, 2015-05-05

2 answers

El autor de este código presumiblemente tuvo que soportar EBCDIC en algún momento, donde los valores numéricos de las letras no son contiguos (existen brechas entre I, J y R, S, como habrás adivinado).

Vale la pena señalar que los estándares C y C++ solo garantizan que los caracteres 0 a 9 tienen valores numéricos contiguos precisamente por esta razón, por lo que ninguno de estos métodos se ajusta estrictamente al estándar.

 215
Author: Wintermute,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-05 10:14:58

Parece que intenta cubrir tanto EBCDIC como ASCII. Su método alternativo no funciona para EBCDIC (tiene falsos positivos, pero no falsos negativos)

C and C++ do require that '0'-'9' are contiguous.

Tenga en cuenta que las llamadas a la biblioteca estándar saben si se ejecutan en ASCII, EBCDIC u otros sistemas, por lo que son más portátiles y posiblemente más eficientes.

 54
Author: MSalters,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-05 10:08:46