Eu estava olhando um código C ++ e encontrei a seguinte construção:
if('A' == 0x41) {
// ...
} else if('A' == 0xc1) {
// ...
} else {
// ...
}
Recebo um aviso do Visual Studio dizendo:
Aviso C4127 expressão condicional é constante.
O Visual Studio está claramente certo - certamente 'A' é definido como 0x41. Por que o autor está escrevendo este código, visto que duas das três ramificações são códigos mortos?
#define IS_CHSET_EBCDIC ('A' == 0xc1)
etc .; ou, em C ++ moderno, torne-o umconstexpr
.Respostas:
0xc1
é oEBCDIC
código do conjunto de caracteres paraA
. O autor está testando para tal máquina.http://www.ibm.com/support/knowledgecenter/en/SSGH4D_15.1.3/com.ibm.xlf1513.aix.doc/language_ref/asciit.html
fonte
else
branch final ? Existe uma codificação de caracteres ainda em uso que não é compatível com ASCII nem com EBCDIC?À primeira vista pode parecer que é um código morto, mas 'A' == 0x41 nem sempre retornará verdadeiro ..
o que o desenvolvedor tentou fazer aqui é preguiçosamente encontrar qual codificação é a máquina que implementa ASCII ou qualquer variante de EBCDIC
como @Richard sugeriu que o Capital a seja mapeado para 0xc1 no Código de Intercâmbio Decimal Codificado em Binário Internacional estendido, veja a tabela abaixo na ramificação 2 do if else ...
outro valor diferente pode ser encontrado por ASCII, por exemplo:
ele poderia muito bem ter feito:
fonte