Em uma biblioteca personalizada, vi uma implementação:
inline int is_upper_alpha(char chValue)
{
if (((chValue >= 'A') && (chValue <= 'I')) ||
((chValue >= 'J') && (chValue <= 'R')) ||
((chValue >= 'S') && (chValue <= 'Z')))
return 1;
return 0;
}
Isso é um ovo de Páscoa ou quais são as vantagens do método C / C ++ padrão?
inline int is_upper_alpha(char chValue)
{
return ((chValue >= 'A') && (chValue <= 'Z'));
}
'J' - 'I'
e'S' - 'R'
ambos iguais1
, então espero que um otimizador razoável gire o primeiro no segundo.Respostas:
O autor deste código, presumivelmente, tinha de apoiar EBCDIC em algum momento, em que os valores numéricos das letras são não contíguas (existem lacunas entre
I
,J
eR
,S
como você deve ter adivinhado).Vale a pena notar que a padrões C ++ única garantia de que os personagens C e
0
para9
ter valores numéricos contíguos precisamente por essa razão, de modo nenhum desses métodos é estritamente padrão-conformidade.fonte
// In the EBCDIC coding, the alphabet has gaps between these values. See URL: xxxx for details
. Então você nunca precisaria fazer a pergunta. Você teria a resposta incorporada ao código.return ( isalpha( chValue ) && isupper( chValue ) )
...Parece que ele tenta cobrir tanto o EBCDIC quanto o ASCII. Seu método alternativo não funciona para EBCDIC (ele possui falsos positivos, mas nenhum falso negativo)
C e C ++ que exigem que
'0'-'9'
são contíguos.Observe que a biblioteca padrão chama não sei se eles são executados em ASCII, EBCDIC ou outros sistemas, por isso eles são mais portáteis e, possivelmente, mais eficiente.
fonte
std::isupper
realmente consulta o código C global instalado no momento.'A'
deve permanecer'A'
independentemente da localidade. ASCII para UTF-8, isso seria possível.std::isupper
consulta o local C global atualmente instalado, sim, mas a fase de compilação que interpreta os caracteres literais não.std::isupper
é realmente necessário na maioria dos casos. Ele respeita as localidades usadas para entrada do usuário. Mas ao analisar arquivos, interagindo com bancos de dados, você normalmente espera algum outro código de idioma. Além disso, pelo menos no Linux, essas chamadas relacionadas ao código do idioma são muito lentas - por exemplo,std::isalpha
chama dynamic_cast duas vezes para "encontrar" a implementação apropriada do código do idioma antes de comparar um único caractere.