Почему алфавит разделен на несколько диапазонов в этом 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 / C ++?

inline int is_upper_alpha(char chValue)
{
return ((chValue >= 'A') && (chValue <= 'Z'));
}

162

Решение

Автор этого кода предположительно должен был поддержать EBCDIC в некоторый момент, когда числовые значения букв не являются смежными (между I, J а также R, Sкак вы уже догадались).

Стоит отметить, что стандарты C и C ++ гарантируют только то, что символы 0 в 9 именно по этой причине имеют непрерывные числовые значения, поэтому ни один из этих методов не соответствует стандартам.

215

Другие решения

Похоже, он пытается охватить как EBCDIC, так и ASCII. Ваш альтернативный метод не работает для EBCDIC (у него есть ложные срабатывания, но нет ложных отрицаний)

C и C ++ делать требовать, чтобы '0'-'9' являются смежными.

Обратите внимание, что стандартные вызовы библиотеки делать знать, работают ли они в ASCII, EBCDIC или других системах, чтобы они были более переносимыми и, возможно, более эффективными.

54

По вопросам рекламы [email protected]