为什么在这个 C 代码中字母表被分成多个范围?

在一个自定义库中,我看到了一个实现:

inline int is_upper_alpha(char chValue)
{
if (((chValue >= 'A') && (chValue <= 'I')) ||
((chValue >= 'J') && (chValue <= 'R')) ||
((chValue >= 'S') && (chValue <= 'Z')))
return 1;
return 0;
}

这是一个 复活节彩蛋还是与标准的 C/C + + 方法相比有什么优势?

inline int is_upper_alpha(char chValue)
{
return ((chValue >= 'A') && (chValue <= 'Z'));
}
6396 次浏览

这段代码的作者可能必须在某个时候支持 EBCDIC,因为字母的数值是非连续的(正如你可能已经猜到的,在 IJRS之间存在间隙)。

值得注意的是,C 和 C + + 标准仅保证字符 09具有连续的数值,正是由于这个原因,所以这两种方法都不是严格符合标准的。

看起来它试图同时涵盖 EBCDIC 和 ASCII。您的替代方法不适用于 EBCDIC (它有假阳性,但没有假阴性)

C 和 C + + 要求 '0'-'9'是连续的。

请注意,标准库调用 知道它们是否运行在 ASCII、 EBCDIC 或其他系统上,因此它们更具可移植性,可能也更有效。