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 un huevo de Pascua o cuáles son las ventajas frente al método estándar C / C ++?
inline int is_upper_alpha(char chValue)
{
return ((chValue >= 'A') && (chValue <= 'Z'));
}
'J' - 'I'
y'S' - 'R'
ambos son iguales1
, entonces espero que un optimizador razonable convierta el primero en el segundo.Respuestas:
El autor de este código, presumiblemente, tuvo que soportar EBCDIC en algún momento, donde los valores numéricos de las letras son no contiguos (existen brechas entre
I
,J
yR
,S
como habrá adivinado).Vale la pena señalar que la C y estándares de C ++ única garantía de que los personajes
0
que9
tienen valores numéricos contiguos precisamente por esta razón, por lo que ninguno de estos métodos es estrictamente estándar conformes.fuente
// In the EBCDIC coding, the alphabet has gaps between these values. See URL: xxxx for details
. Entonces nunca tendrías que hacer la pregunta. Tendría la respuesta incorporada al código.return ( isalpha( chValue ) && isupper( chValue ) )
...Parece que intenta cubrir tanto EBCDIC como ASCII. Su método alternativo no funciona para EBCDIC (tiene falsos positivos, pero no falsos negativos)
C y C ++ no requieren que
'0'-'9'
son contiguos.Tenga en cuenta que las llamadas a las bibliotecas estándar no sabe si se ejecutan en ASCII, EBCDIC o otros sistemas, por lo que son más fáciles de transportar y posiblemente más eficiente.
fuente
std::isupper
en realidad consulta la configuración regional global C actualmente instalada.'A'
tiene que permanecer'A'
independientemente de la configuración regional. ASCII a UTF-8, eso sería posible.std::isupper
consulta la configuración regional global C instalada actualmente, sí, pero la fase de compilación que interpreta los literales de caracteres no.std::isupper
realmente es necesario en la mayoría de los casos. Respeta las configuraciones regionales utilizadas para la entrada del usuario. Pero al analizar archivos, al interactuar con bases de datos, generalmente se espera algún otro entorno local. Además, al menos en Linux, estas llamadas relacionadas con la configuración regional son muy lentas; por ejemplo,std::isalpha
llama a dynamic_cast dos veces para "encontrar" la implementación de la configuración regional adecuada antes de comparar un solo carácter.