Требуются ли для цифр символов ['0' .. '9'] непрерывные числовые значения? - PullRequest
19 голосов
/ 23 февраля 2012

Необходимо, чтобы реализация C ++ установила символы '0' - '9' так, чтобы они имели непрерывные числовые значения, т. Е. Чтобы:

'0' -> 0+n
'1' -> 1+n
 m  -> m+n
'9' -> 9+n

Я не могу найти упомянутое в документации isdigit ([классификация] (22.3.3.1 Классификация символов)) *, и при этом я не могу найти это в документации локали (но возможно я не выглядел достаточно трудно).

В 2.3 наборах символов мы находим, что

Базовый исходный набор символов состоит из 96 символов: пробел, управляющие символы, представляющие горизонтальная табуляция, вертикальная табуляция, подача формы и новая строка, а также следующие 91 графический символ

Но там не упоминается ни о каком порядке (но, возможно, я не выглядел достаточно усердно).


*: Интересная сноска там:

При использовании в цикле быстрее кэшировать фасет ctype <> и использовать его непосредственно [вместо isdigit () и др., Конец комментария] или использовать векторную форму ctype <> :: is.

1 Ответ

22 голосов
/ 23 февраля 2012

Действительно, не выглядел достаточно сложно: в 2.3. Наборы символов, позиция 3:

В исходных и исполнительных базовых наборах символов значение каждого символа после 0 в выше список десятичных цифр должен быть на единицу больше, чем значение предыдущего .

И это выше список десятичных цифр:

0 1 2 3 4 5 6 7 8 9

Следовательно, реализация должна использовать набор символов, в котором десятичные цифры имеют непрерывное представление. Таким образом, оптимизация, в которой вы полагаетесь на это свойство, безопасна; однако оптимизации, в которых вы полагаетесь на совпадение других цифр (например, 'a' .. 'z'), являются , а не portable w.r.t. к стандарту (см. также заголовок <cctype>). Если вы сделаете это, убедитесь, что подтвердили это свойство.

...