Разработчик компилятора выбирает базовый набор символов. Единственное, что должен сказать стандарт, это то, что должно быть доступно определенное минимальное количество символов и что числовые символы являются смежными.
Обязательные символы для среды выполнения C99: от A
до Z
, a
до z
, 0
до 9
(которые должны быть вместе и по порядку), любые из !"#%&'()*+,-./:;<=>?[\]^_{|}~
, пробел, горизонтальная табуляция, вертикальная табуляция, подача формы, оповещение, возврат, возврат каретки и новая строка. Это остается неизменным в текущем проекте C1x, следующей итерации этого стандарта.
Все остальное зависит от реализации.
Например, код вроде:
int isUpperAlpha(char c) {
return (c >= 'A') && (c <= 'Z');
}
сломается на мэйнфрейме, который использует EBCDIC, разделяя символы верхнего регистра на две области.
Действительно переносимый код примет это во внимание. Весь другой код должен документировать его зависимости.
Более переносимая реализация вашего примера будет выглядеть примерно так:
static char chrs[] = "zyxwvutsrqponmlkjihgfedcba";
char *pCh = chrs;
while (*pCh != 0) {
printf ("char is %c and the value is %d\n", *pCh, *pCh);
pCh++;
}
Если вы хотите портативное решение real , вам, вероятно, следует использовать islower()
, поскольку код, который проверяет только латинские символы, не будет переносимым (например) на греческий язык, использующий Unicode для своего основного набора символов .