Ich habe mir C ++ - Code angesehen und das folgende Konstrukt gefunden:
if('A' == 0x41) {
// ...
} else if('A' == 0xc1) {
// ...
} else {
// ...
}
Ich erhalte eine Visual Studio- Warnung mit folgenden Worten:
Warnung Der bedingte Ausdruck C4127 ist konstant.
Visual Studio hat eindeutig Recht - sicherlich ist 'A' als 0x41 definiert. Warum schreibt der Autor diesen Code, da zwei der drei Zweige toter Code sind?
#define IS_CHSET_EBCDIC ('A' == 0xc1)
usw.; oder machen Sie es in modernem C ++ zu einemconstexpr
.Antworten:
0xc1
ist derEBCDIC
Zeichensatzcode fürA
. Der Autor testet für eine solche Maschine.http://www.ibm.com/support/knowledgecenter/de/SSGH4D_15.1.3/com.ibm.xlf1513.aix.doc/language_ref/asciit.html
quelle
else
Zweig? Gibt es eine noch verwendete Zeichenkodierung, die weder mit ASCII noch mit EBCDIC kompatibel ist?Auf den ersten Blick mag das so aussehen, als wäre der Code tot, aber 'A' == 0x41 gibt nicht immer true zurück.
Was der Entwickler hier versucht hat, ist träge herauszufinden, welche Codierung der Computer ist, der ASCII oder eine andere Variante von EBCDIC implementiert
Wie @Richard vorgeschlagen hat, wird Capital a im International - Extended Binary Coded Decimal Interchange Code auf 0xc1 abgebildet ( siehe Tabelle unten im Zweig 2 des if else ...
Ein anderer anderer Wert könnte von ASCII gefunden werden, zum Beispiel:
er hätte genauso gut tun können:
quelle