为什么要将字符“A”与0x41进行比较?

90

我正在查看一些C++代码,发现了以下结构:

if('A' == 0x41) {
  // ...
} else if('A' == 0xc1) {
  // ...
} else {
  // ...
}

我在 Visual Studio 中收到一个警告:

警告 C4127:条件表达式是常量。

显然,Visual Studio 是正确的——'A' 肯定被定义为 0x41。鉴于三个分支中有两个是死代码,为什么作者要编写这段代码呢?


30
它们不一定是死代码,也许只是检查字符集的愚蠢方式。 - George
61
"A" 在 EBCDIC 中的代码是 C1。 - harold
14
我会把它放在一个实用的头文件中,作为 #define IS_CHSET_EBCDIC ('A' == 0xc1) 等等;或者,在现代 C++ 中,可以将其定义为 constexpr - Peter - Reinstate Monica
8
不,你可以从个人电脑交叉编译到大型计算机。因此,“A”必须表示执行字符集中字符的值。 - Bo Persson
2
这些年轻的小家伙们习惯于ASCII字符集,他们根本不知道他们错过了多少有趣的东西。 - Thorbjørn Ravn Andersen
显示剩余12条评论
2个回答

118

14
有没有比这更好的方法来检查字符集?目前没有标准化的方法。在 C11 中,有一种方法可以检查是否使用了某些 Unicode 编码,但 MSVC 甚至不完全支持 C99(早于 C11)。"这种替代字符集有多常见!"除了 IBM 大型机以外,根本不常见。 - user824425
2
那么最终的“else”分支是用来做什么的?是否还有一种仍在使用的字符编码既不兼容ASCII也不兼容EBCDIC? - dan04
8
据我所知没有这样的方法,但实际上可能只需要添加一个“未知编码,打印错误信息”的分支即可解决问题。 - user743382
8
在苹果II DOS 3.3字符编码中,'A'也表示为0xC1,这是将ASCII码与0x80按位或运算的结果。 - Damian Yerrick
2
@Rhymoid 实际上,微软在支持C99之前实现C11的机会很大。他们是反对难以实现的C99功能的供应商之一,其中两个在C11中不再是强制性的 https://en.wikipedia.org/wiki/C11_(C_standard_revision)#Optional_features。 - Steve Cox
显示剩余21条评论

11

乍一看可能看起来像是无用代码,但是 'A' == 0x41 不总是返回true...

开发者在这里尝试偷懒地找出机器实现的编码方式,是ASCII还是任何一个变体的EBCDIC。

正如@Richard建议的那样,在国际扩展二进制编码十进制交换码中,大写字母a被映射为0xc1,请见下面的表格在if else的第2个分支...

enter image description here

ASCII也可以找到另一个不同的值,例如:

enter image description here

他也可以这样做:

if('p' == 0x70) {
  // ...
} else if('p' == 0x97) {
  //...
}

在第二段中,你是不是指的是 EBCDIC 而不是 EBDIC? - Zze

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