Estaba mirando algo de código C ++ y encontré la siguiente construcción:
if('A' == 0x41) {
// ...
} else if('A' == 0xc1) {
// ...
} else {
// ...
}
Recibo una advertencia de Visual Studio que dice:
Advertencia La expresión condicional C4127 es constante.
Visual Studio está claramente en lo cierto, seguramente 'A' se define como 0x41. ¿Por qué el autor escribe este código, dado que dos de las tres ramas son códigos muertos?
#define IS_CHSET_EBCDIC ('A' == 0xc1)
etc .; o, en C ++ moderno, conviértalo en unconstexpr
.Respuestas:
0xc1
es elEBCDIC
código del juego de caracteres paraA
. El autor está probando una máquina así.http://www.ibm.com/support/knowledgecenter/en/SSGH4D_15.1.3/com.ibm.xlf1513.aix.doc/language_ref/asciit.html
fuente
else
rama final ? ¿Existe una codificación de caracteres aún en uso que no sea compatible ni con ASCII ni con EBCDIC?A primera vista puede parecer que es un código muerto, pero 'A' == 0x41 no siempre devolverá verdadero.
lo que el desarrollador intentó hacer aquí es encontrar perezosamente qué codificación es la máquina que implementa ASCII o cualquier variante de EBCDIC
como sugirió @Richard, Capital a se asigna a 0xc1 en el código de intercambio decimal codificado en binario extendido internacional, consulte la tabla a continuación en la rama 2 de if else ...
ASCII podría encontrar otro valor diferente, por ejemplo:
bien podría haber hecho:
fuente