Почему алфавит разбит на несколько диапазонов в этом коде на 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 или других системах, поэтому они более переносимы и, возможно, более эффективны.