Почему алфавит разбит на несколько диапазонов в этом коде на C?
В пользовательской библиотеке я увидел реализацию:
inline int is_upper_alpha(char chValue)
{
if (((chValue >= 'A') && (chValue <= 'I')) ||
((chValue >= 'J') && (chValue <= 'R')) ||
((chValue >= 'S') && (chValue <= 'Z')))
return 1;
return 0;
}
Является ли это пасхальное яйцо или каковы преимущества против стандартного метода C/С++?
inline int is_upper_alpha(char chValue)
{
return ((chValue >= 'A') && (chValue <= 'Z'));
}
Ответы
Ответ 1
Автор этого кода предположительно должен был поддерживать EBCDIC в какой-то момент, когда числовые значения букв являются несмежными (существуют промежутки между I
, J
и R
, S
, как вы могли догадаться).
Стоит отметить, что стандарты C и С++ гарантируют, что символы 0
до 9
имеют целые числовые значения именно по этой причине, поэтому ни один из этих методов не является строго стандартным.
Ответ 2
Похоже, он пытается охватить как EBCDIC, так и ASCII. Ваш альтернативный метод не работает для EBCDIC (у него есть ложные срабатывания, но нет ложных негативов)
C и С++ требуют, чтобы '0'-'9'
были смежными.
Обратите внимание, что стандартные вызовы библиотеки знают, работают ли они в ASCII, EBCDIC или других системах, поэтому они более переносимы и, возможно, более эффективны.