char对象比较的语义

Dan*_*ien 8 c++ char character-encoding

当我今天阅读一些旧代码时,我注意到以下assert行:

assert(('0' <= hexChar && hexChar <= '9')
    || ('A' <= hexChar && hexChar <= 'F')
    || ('a' <= hexChar && hexChar <= 'f'));
Run Code Online (Sandbox Code Playgroud)

目的是断言这hexChar是一个十六进制数字([0-9A-Fa-f]).这是通过依靠一个ASCII样订货char表示对象'A','B'...,'F''a','b'..., 'f'.

考虑到执行字符集是实现定义的,我开始想知道这是否总是按照我的意图行事.

第2.3节中的C++标准,字符集,提及:

基本执行字符集基本执行宽字符集应各自包含的基本来源字符集表示警报,退格,并回车所有成员,再加上控制字符,再加上一个空字符(分别为空宽字符),其表示具有全零位.对于每个基本执行字符集,成员的值应是非负的并且彼此不同.在源和执行基本字符集中,上述十进制数字列表中0之后的每个字符的值应比前一个值大1.在执行字符集执行宽字符集是设置基本执行字符和基本执行宽字符集的实现所定义的超集,分别.执行字符集的成员值和其他成员集是特定于语言环境的.

我认为这意味着('0' <= hexChar && hexChar <= '9')没关系,因为'0','1'...,'9'是数字,每个都有一个大于前一个的值.但是,其他基本源字符相对于彼此的顺序仍然是实现定义的.

这是正确的陈述吗?对C++编译器一无所知(所以不知道实现细节),我是否需要重写assert如下?

assert(('0' <= hexChar && hexChar <= '9')
    || ('A' == hexChar || 'B' == hexChar || 'C' == hexChar || 'D' == hexChar || 'E' == hexChar || 'F' == hexChar)
    || ('a' == hexChar || 'b' == hexChar || 'c' == hexChar || 'd' == hexChar || 'e' == hexChar || 'f' == hexChar));
Run Code Online (Sandbox Code Playgroud)

R..*_*R.. 7

第一行中,对的值进行比较'0''9'为100%便携式的.C语言保证所有实现都具有相同的行为.

第二行和第三行原则上是实现定义的,但从来没有,也永远不会是一个行为不同的实现.一个曾经被用来与C语言中唯一的非0646兼容的字符编码(和唯一的原因C允许非0646兼容的编码)是EBCDIC,哪个地方的信件'A'通过'F'确切位置,他们跌倒为十六进制值(以一般来说,这些字母在EBCDIC中是不连续的,但AF是一个连续的组.

话虽如此,除非您需要支持传统大型机,否则尝试在C中"可移植"处理基本字符编码没有任何价值,char8位,值0-127是ASCII,值128-255是我们有一天能够假设的区域设置或数据特定的多字节字符编码始终是UTF-8.


CB *_*ley 5

对你的第一个问题:是的.

对于您的第二个问题:也许,但您可能应该考虑使用C库isxdigit函数或C++语言环境变体.