Patrzyłem na kod w C ++ i znalazłem następującą konstrukcję:
if('A' == 0x41) {
// ...
} else if('A' == 0xc1) {
// ...
} else {
// ...
}
Otrzymuję ostrzeżenie programu Visual Studio o treści:
Ostrzeżenie Wyrażenie warunkowe C4127 jest stałe.
Visual Studio ma rację - z pewnością „A” jest zdefiniowane jako 0x41. Dlaczego autor pisze ten kod, skoro dwie z trzech gałęzi to martwy kod?
#define IS_CHSET_EBCDIC ('A' == 0xc1)
itp .; lub, we współczesnym C ++, zrób toconstexpr
.Odpowiedzi:
0xc1
toEBCDIC
kod zestawu znaków dlaA
. Autor testuje taką maszynę.http://www.ibm.com/support/knowledgecenter/en/SSGH4D_15.1.3/com.ibm.xlf1513.aix.doc/language_ref/asciit.html
źródło
else
gałąź? Czy nadal jest używane kodowanie znaków, które nie jest zgodne ani z ASCII, ani z EBCDIC?Na pierwszy rzut oka może się wydawać, że jest to martwy kod, ale „A” == 0x41 nie zawsze zwróci prawdę.
programista próbował tutaj leniwie znaleźć kodowanie maszyny implementującej ASCII lub dowolny wariant EBCDIC
jak zasugerował @Richard, kapitał a jest mapowany na 0xc1 w międzynarodowym - rozszerzonym kodowanym binarnym kodzie dziesiętnym - patrz tabela poniżej w gałęzi 2 instrukcji if else ...
inną inną wartość można znaleźć w ASCII, na przykład:
mógł równie dobrze zrobić:
if('p' == 0x70) { // ... } else if('p' == 0x97) { //... }
źródło