2015-05-05 7 views
160

В пользовательской библиотеке я увидел реализацию:Почему алфавит разбит на несколько диапазонов в этом коде на 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; 
} 

ли что Easter egg или какие преимущества против метода стандарт C/C++?

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

Обратите внимание, что в EBCDIC, диапазон символов для строчных букв идет до диапазона символов для прописных букв, и оба приходят перед цифрами - который прямо противоположен порядку в ASCII основе кодировок (например, серии 8859-x, или Unicode, или CP1252, или ...). –

+1

Примечание: если '«J»-«I'' и '» S «-» R'' оба равны '1', то я ожидаю, что разумный оптимизатор превратить бывший в последнем. –

ответ

215

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

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

+1

Да, это уверен, что автор хочет поддерживать код EBCDIC 037. чтобы проверить коды EBCDIC, пожалуйста, перейдите по ссылке http://en.wikipedia.org/wiki/EBCDIC_037 –

+1

Да, вы правы. Метод реализован для несмежных букв в EBCDIC. Спасибо за ответ! –

+64

Настоящий WTF почему оригинальный автор не добавил комментарий: '// В кодировке EBCDIC у алфавита есть пробелы между этими значениями. Подробнее см. URL: xxxx. Тогда вам даже не придется задавать вопрос. У вас есть ответ, встроенный в код. – abelenky

54

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

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

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

+5

'std :: isupper' фактически запрашивает установленную в настоящий момент глобальную локаль C. – Lingxi

+1

Да, вы правы. Метод написан для покрытия обоих кодировок. Спасибо за ответ! –

+4

@Lingxi: Правда, но это не значит, что вы можете переключить язык с ASCII на EBCDIC. '' A'' должен оставаться '' A'', независимо от языка. ASCII - UTF-8, это было бы возможно. – MSalters