数字字符 ['0'..'9'] 是否需要具有连续的数值?

23

在 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<> facet 并直接使用它比使用 isdigit() 等更快,或者使用 ctype<>::is 的向量形式。


10
为什么要投票关闭问题:“这个问题与我们的问答格式不太适合。我们期望答案通常涉及事实、参考资料或特定专业知识;这个问题可能会引发观点、辩论、争论、投票或延长讨论。” 我有事实、参考资料和特定的专业知识,答案可能不涉及观点、辩论、争论或投票,但可能会涉及对标准的参考,因此也不需要进行长时间讨论?是某个拥有管理权限的人不正常吗? - Sebastian Mach
这不属于区域设置内容,因为它还需要处理其他数字(例如 ;) )。 - MSalters
1个回答

25

实际上没有看得够仔细:在 2.3 字符集中的第3项中:

在源代码和执行基本字符集中,在上述十进制数字列表中,每个数字零之后的每个字符的值应为前一个字符的值加一

以下是上述十进制数字列表:

0 1 2 3 4 5 6 7 8 9
因此,实现必须使用一个字符集,其中十进制数字具有连续表示。因此,您依赖于此属性的优化是安全的;但是,您依赖于其他数字的连续性(例如'a'..'z')的优化不符合标准的可移植性(也请参阅头文件)。如果您这样做,请确保断言该属性。

感谢 @cHao 的提示。惊人。 - Sebastian Mach
1
事实上,ASCII(及其衍生版本)和EBCDIC都将十进制数字分配给连续的值。 ASCII使小写字母和大写字母连续; EBCDIC则不是这样。这可能是为什么C和C ++要求连续的数字,但不要求连续的字母。绝大多数C ++实现使用ASCII或其衍生版本(Latin-1,Windows-1252,Unicode等); 其余大部分使用EBCDIC。 - Keith Thompson
@CodingMastero:我通常会等几天以鼓励更多的答案。也许有人除了参考资料外还提供了一些历史背景 :) - Sebastian Mach
是你提出问题并回答了。那你还需要什么? - Rohit Vipin Mathews
@CodingMastero:没错,但有时候一些回答者会提供额外的信息和见解。我不想阻止任何人发帖。然而,时间缓冲已经结束,我接受了这个答案。 - Sebastian Mach
如果ISO C也有同样的保证,您能在这个答案中提到吗?当我谷歌搜索“C digits contiguous”时,它出现了。更新:确实有,为什么在C中减去'0'会得到字符所代表的数字? - Peter Cordes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接