Должны ли символьные цифры ['0'..'9'] иметь непрерывные числовые значения?

Должна ли реализация 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.


person Sebastian Mach    schedule 23.02.2012    source источник
comment
Почему голосование за закрытие: This question is not a good fit to our Q&A format. We expect answers to generally involve facts, references, or specific expertise; this question will likely solicit opinion, debate, arguments, polling, or extended discussion. У меня есть факты, ссылки, конкретный опыт, и ответ, вероятно, не будет включать в себя запрос мнений, дебатов, аргументов, опросов, а, скорее всего, ссылку на стандарт, поэтому также не будет расширенного обсуждения? Кто-то обладает модными способностями?   -  person Sebastian Mach    schedule 23.02.2012
comment
Дело не в локали, потому что это касается и других цифр. (Например, ;))   -  person MSalters    schedule 24.02.2012


Ответы (1)


Действительно невнимательно смотрел: в 2.3. Наборы символов, пункт 3:

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

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

0 1 2 3 4 5 6 7 8 9

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

person Sebastian Mach    schedule 23.02.2012
comment
Спасибо @cHao за подсказку. Удивительный. - person Sebastian Mach; 23.02.2012
comment
Как это бывает, и ASCII (и его производные), и EBCDIC присваивают непрерывные значения десятичным цифрам. ASCII делает строчные буквы смежными, как и прописные буквы; EBCDIC нет. Вероятно, поэтому C и C++ требуют последовательных цифр, а не последовательных букв. Подавляющее большинство реализаций C++ используют ASCII или одну из его производных (Latin-1, Windows-1252, Unicode и т. д.); подавляющее большинство остальных используют EBCDIC. - person Keith Thompson; 24.02.2012
comment
@CodingMastero: обычно я жду несколько дней, чтобы получить больше ответов. Может быть, кто-то предоставит какую-то историческую справку помимо ссылок :) - person Sebastian Mach; 24.02.2012
comment
это вы тоже спросили и ответили. Тогда что еще вам нужно? - person Rohit Vipin Mathews; 24.02.2012
comment
@CodingMastero: правда, но достаточно часто некоторые ответчики предоставляют дополнительную информацию и понимание. Я не хотел никого отговаривать от публикации. Однако временной буфер закончился, и я согласился. - person Sebastian Mach; 29.02.2012
comment
Если ISO C также имеет такую ​​​​же гарантию, не могли бы вы упомянуть об этом в этом ответе? Это всплыло, когда я погуглил C digits contiguous. Обновление: да, Почему вычитание '0' в C приводит к числу, которое представляет char? - person Peter Cordes; 29.04.2021