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

Vla*_*Ch. 161 c c++ character toupper

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

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

这是复活节彩蛋还是与标准C/C++方法相比有哪些优势?

inline int is_upper_alpha(char chValue)
{
    return ((chValue >= 'A') && (chValue <= 'Z'));
}
Run Code Online (Sandbox Code Playgroud)

Win*_*ute 214

这段代码的作者可能必须支持EBCDIC在某些时候,其中字母的数值是不连续的(之间存在着差距I,J并且R,S正如你可能已经猜到了).

值得一提的是,C和C++标准只保证字符09具有连续的数值正是这个原因,所以这些方法都不是严格符合标准的.

  • @abelenky如果代码最初用于通常使用ebcdic的系统,那么它当时可能看起来很明显而且不需要评论,遗憾的是,遗留代码中似乎很好的东西现在看起来很奇怪. (66认同)
  • 真正的WTF是原作者没有发表评论的原因:`//在EBCDIC编码中,字母表在这些值之间存在差距.有关详细信息,请参阅URL:xxxx.那你甚至不用问这个问题.你有代码内置的答案. (64认同)
  • @abelenky:*real*WTF是为什么原作者没有使用标准功能,即`return(isalpha(chValue)&& isupper(chValue))`... (25认同)
  • 如果它是为了支持1970年代的EBCDIC而编写的,isalpha和isupper甚至是ANSI还是当时大多数编译器支持的? (6认同)
  • @Damon:这不是问题.即使在本机不使用该编码的系统上,您也可能必须*处理*"外来"编码.所以你将你的语言环境设置为给定的编码,然后你必须保持手指交叉,程序员实际上使用标准函数,而不是像上面那样做"智能"编码,认为他知道他的程序将遇到的每个编码... (4认同)
  • @DevSolar:实际上`isalpha`是错的; 其结果是特定于语言环境的,用于在用户配置的语言环境中处理自然语言,而大多数软件的实际需要是匹配与语言环境无关的固定字符集. (3认同)
  • @R.:根据我的经验,大多数软件的*实际需要*是匹配"单词内容"或类似内容,而程序员完全忘记了语言环境问题...在任何一种情况下,评论都会有很多好处.;-) (2认同)

MSa*_*ers 54

看起来它试图涵盖EBCDIC和ASCII.您的替代方法不适用于EBCDIC(它有误报,但没有误报)

C和C++ 确实要求'0'-'9'是连续的.

请注意,标准库调用确实知道它们是在ASCII,EBCDIC还是其他系统上运行,因此它们更便于携带并且可能更高效.

  • `std :: isupper`实际上查询当前安装的全局C语言环境. (5认同)
  • @Lingxi:是的,但这并不意味着您可以将语言环境从ASCII切换到EBCDIC."A"必须保持"A",无论当地情况如何.ASCII到UTF-8,这是可能的. (4认同)
  • @Lingxi:`std :: isupper`查询当前安装的全局C语言环境,是的,但解释字符文字的编译阶段却没有. (2认同)