我正在查看一些C++代码,发现了以下结构:
if('A' == 0x41) {
// ...
} else if('A' == 0xc1) {
// ...
} else {
// ...
}
我在 Visual Studio 中收到一个警告:
警告 C4127:条件表达式是常量。
显然,Visual Studio 是正确的——'A' 肯定被定义为 0x41。鉴于三个分支中有两个是死代码,为什么作者要编写这段代码呢?
我正在查看一些C++代码,发现了以下结构:
if('A' == 0x41) {
// ...
} else if('A' == 0xc1) {
// ...
} else {
// ...
}
我在 Visual Studio 中收到一个警告:
警告 C4127:条件表达式是常量。
显然,Visual Studio 是正确的——'A' 肯定被定义为 0x41。鉴于三个分支中有两个是死代码,为什么作者要编写这段代码呢?
0xc1
是EBCDIC
字符集中表示字母A的编码。作者正在测试这样一台机器。
乍一看可能看起来像是无用代码,但是 'A' == 0x41 不总是返回true...
开发者在这里尝试偷懒地找出机器实现的编码方式,是ASCII还是任何一个变体的EBCDIC。
正如@Richard建议的那样,在国际扩展二进制编码十进制交换码中,大写字母a被映射为0xc1,请见下面的表格在if else的第2个分支...
ASCII也可以找到另一个不同的值,例如:
他也可以这样做:
if('p' == 0x70) {
// ...
} else if('p' == 0x97) {
//...
}
#define IS_CHSET_EBCDIC ('A' == 0xc1)
等等;或者,在现代 C++ 中,可以将其定义为constexpr
。 - Peter - Reinstate Monica