Зачем сравнивать символ «А» с 0x41?

89

Я просматривал код C ++ и нашел следующую конструкцию:

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

Я получаю предупреждение Visual Studio :

Предупреждение C4127 Условное выражение является постоянным.

Visual Studio явно права - безусловно, A определяется как 0x41. Почему автор пишет этот код, учитывая, что две из трех веток - мертвый код?

H Беллами
источник
30
Это не обязательно мертвый код, возможно, это просто глупый способ проверить набор символов.
Джордж
60
'A' = C1 в EBCDIC
Гарольд
14
Я бы поместил это в заголовок утилиты и #define IS_CHSET_EBCDIC ('A' == 0xc1)т.д .; или, в современном C ++, сделайте его constexpr.
Питер - Восстановить Монику
8
@ b.buchhold - Нет, вы можете выполнить кросс-компиляцию с ПК на мэйнфрейм. Таким образом, «A» должно означать значение символа в наборе символов выполнения.
Bo Persson
2
Похоже, что это лучше всего сделать с помощью условного включения препроцессора (например, #if 'a' == 41 ... #else ... #endif) для этого, а не динамических ветвей, чтобы вы не получали подобных предупреждений . Это сработает?
templatetypedef

Ответы:

116

0xc1- это EBCDICкод набора символов для A. Автор тестирует такую ​​машину.

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

Ричард Ходжес
источник
14
"есть ли лучший способ проверить набор символов?" Стандартного способа сделать это не существует. В C11 есть способ проверить, используются ли определенные кодировки Unicode, но MSVC даже не будет полностью поддерживать C99 (который предшествует C11). «Насколько распространен этот альтернативный набор символов!» Помимо мэйнфреймов IBM? Не за что.
2
Так для чего же последняя elseветка? Есть ли еще используемая кодировка символов, совместимая ни с ASCII, ни с EBCDIC?
dan04
8
@ dan04 Мне ничего не известно, но на самом деле это может быть такая же простая ветка, как «неизвестная кодировка, сообщение об ошибке печати».
8
'A' также является 0xC1 в кодировке символов Apple II DOS 3.3, которая является ASCII OR с 0x80.
Damian Yerrick
2
@Rhymoid На самом деле есть большая вероятность, что Microsoft внедрит C11 прежде, чем когда-либо будет поддерживать C99. Они были одним из поставщиков, которые отказались от сложных в реализации функций C99, две из которых больше не являются обязательными в C11 en.wikipedia.org/wiki/… .
Стив Кокс,
11

На первый взгляд может показаться, что это мертвый код, но 'A' == 0x41 не всегда вернет истину.

здесь разработчик пытался найти ленивую кодировку, в которой машина реализует ASCII или любой вариант EBCDIC.

как предположил @Richard, Capital a сопоставлен с 0xc1 в международном расширенном двоично-десятичном коде обмена, см. таблицу ниже во второй ветви if else ...

введите описание изображения здесь

другое другое значение может быть найдено с помощью ASCII, например:

введите описание изображения здесь

с таким же успехом он мог бы сделать:

if('p' == 0x70) {
  // ...
} else if('p' == 0x97) {
  //...
}
ΦXocę 웃 Пepeúpa ツ
источник
Во втором абзаце - вы имели в виду EBCDIC вместо EBDIC?
Zze 06