В пользовательской библиотеке я увидел реализацию:
inline int is_upper_alpha(char chValue)
{
if (((chValue >= 'A') && (chValue <= 'I')) ||
((chValue >= 'J') && (chValue <= 'R')) ||
((chValue >= 'S') && (chValue <= 'Z')))
return 1;
return 0;
}
Это пасхальное яйцо или в чем преимущества стандартного метода Си / Си ++?
inline int is_upper_alpha(char chValue)
{
return ((chValue >= 'A') && (chValue <= 'Z'));
}
'J' - 'I'
и'S' - 'R'
оба равны1
, то я ожидаю, что разумный оптимизатор превратит первое в последнее.Ответы:
Автор этого кода предположительно должен был поддерживать EBCDIC в какой - то точке, где числовые значения букв являются Непоследовательными (пробела существуют между
I
,J
иR
,S
как вы уже догадались).Стоит отметить , что C и C ++ стандарты только гарантирует , что символы
0
не9
имеют непрерывные числовые значения именно по этой причине, так что ни один из этих методов, строго соответствующий стандартам.источник
// In the EBCDIC coding, the alphabet has gaps between these values. See URL: xxxx for details
. Тогда вам даже не придется задавать вопрос. У вас есть ответ, встроенный в код.return ( isalpha( chValue ) && isupper( chValue ) )
...Похоже, он пытается охватить как EBCDIC, так и ASCII. Ваш альтернативный метод не работает для EBCDIC (у него есть ложные срабатывания, но нет ложных отрицаний)
C и C ++ действительно требуют,
'0'-'9'
являются смежными.Обратите внимание , что стандартные библиотечные вызовы действительно знают , запускать ли они на ASCII, EBCDIC или других систем, поэтому они более портативными и , возможно , более эффективным.
источник
std::isupper
фактически запрашивает текущую установленную глобальную локаль C'A'
должен остаться'A'
независимо от локали. ASCII в UTF-8, это было бы возможно.std::isupper
запрашивает установленную глобальную локаль C, да, но фаза компиляции, которая интерпретирует символьные литералы, - нет.std::isupper
действительно ли это необходимо в большинстве случаев. Он учитывает локали, используемые для ввода от пользователя. Но при разборе файлов, взаимодействии с базами данных вы обычно ожидаете какой-то другой язык. Более того, по крайней мере в Linux эти вызовы, связанные с локалью, очень медленные - например,std::isalpha
два раза вызывает dynamic_cast, чтобы «найти» правильную реализацию локали, прежде чем сравнивать один символ.