为什么将字符"A"与0x41进行比较?

H B*_*amy 89 c++ string

我正在查看一些C++代码并找到以下构造:

if('A' == 0x41) {
  // ...
} else if('A' == 0xc1) {
  // ...
} else {
  // ...
}
Run Code Online (Sandbox Code Playgroud)

我得到一个Visual Studio警告说:

警告C4127条件表达式是常量.

Visual Studio显然是正确的 - 当然'A'被定义为0x41.为什么作者编写这段代码,因为三个分支中有两个是死代码?

Ric*_*ges 116

0xc1是的EBCDIC字符集代码A.作者正在测试这样一台机器.

http://www.ibm.com/support/knowledgecenter/en/SSGH4D_15.1.3/com.ibm.xlf1513.aix.doc/language_ref/asciit.html

  • "有没有更好的方法来检查字符集?" 没有标准的方法可以这样做.在C11中,有一种方法可以检查是否正在使用某些Unicode编码,但MSVC甚至不会完全支持C99(早于C11)."这个替代字符集有多常见!" 除了IBM大型机?一点也不. (14认同)
  • @ dan04我不知道,但它实际上可以像"未知编码,打印错误消息"分支一样简单. (8认同)
  • 'A'在Apple II DOS 3.3字符编码中也是0xC1,与ASCII进行ASCII或与0x80. (8认同)
  • 那么最后的'else`分支是什么?是否仍然使用的字符编码既不兼容ASCII也不兼容EBCDIC? (2认同)
  • @Rhymoid微软实际上很有可能在支持C99之前实现C11.他们是反对难以实施C99功能的供应商之一,其中两个在C11 https://en.wikipedia.org/wiki/C11_(C_standard_revision)#Optional_features中不再是强制性的. (2认同)
  • @Luaan我非常不同意不需要兼容ABI的C编译器的想法.还有相当多的重要软件用C语言编写,从基本库(例如zlib,SDL2)到编译器,运行时和各种编程语言的运行时扩展(例如Python).无论喜欢与否,C语言都比C++更具通俗性. (2认同)
  • @Rhymoid嗯,当然MSVC++支持C链接; 所有Windows API都是C风格的声明和函数,它是最常用的互操作方式(以及COM).如果不是这样,那么让所有那些非C++平台都符合API将会困难得多,并且这几乎不会让Windows变得如此受欢迎:) (2认同)

ΦXo*_*a ツ 11

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

开发人员试图在这里做的是懒洋洋地找到机器实现ASCIIEBCDIC的任何变体的编码

正如@Richard所建议的那样,资本a被映射到国际 - 扩展二进制编码的十进制交换代码中的0xc1, 参见if e​​lse的2分支中的下表...

在此输入图像描述

ASCII可以为exmaple找到另一个不同的值:

在此输入图像描述

他也可以做​​到:

if('p' == 0x70) {
  // ...
} else if('p' == 0x97) {
  //...
}
Run Code Online (Sandbox Code Playgroud)