'??' está sendo convertido em '^' no visual c ++. Por que isso está acontecendo e qual é a saída?
-
27-09-2019 - |
Pergunta
'??' é convertido em '^' se eu compilar o programa MN VC ++ e executá -lo
por exemplo
sprintf( ch, "??")
imprime
^
Mas se eu executar o mesmo código em turbo c/c ++, não existe esse problema. Por que isso está acontecendo no VC ++ no Windows?
Solução
??
sozinho não é um Trigraph, Apesar ??'
corresponde a ^
.
Talvez você tenha digitado aqui diferente do que você tem no código e não pode ver a citação única na sua string, porque está muito perto da cotação de fechamento.
Então, no código que você provavelmente tem:
sprintf( ch, "??'");
Outras dicas
Tem certeza de que era uma quarta dupla e não uma única citação? Se foi ?? ', então você acabou de encontrar um Trigraph, que é um "recurso" que Realmente deve ser removido, mas não é devido à IBM não migrar para o UTF-8 do EBCDIC. (As trigrafias foram consideradas para remoção quando o C ++ 0x ainda estava aberto para mudanças, mas a mudança para remover as trigrafias foi veementemente bloqueada pela IBM e seus representantes no Comitê ISO C ++).
o ??
Normalmente, a sequência inicia uma trigraph, mas a sequência "??" Não é uma trigraph, então não deve ser interpretada como tal - talvez haja um bug no compilador - exatamente qual versão você está usando e qual é o código exato (incluindo declarações variáveis)?
Este código imprime "??" Em várias versões do MSVC 6 a VS 2010, como você pode esperar:
char ch[20];
sprintf( ch, "??");
printf( "%s\n", ch);
Mas substitua o snprintf()
linha com:
sprintf( ch, "'??'");
e a saída se torna "'^
"(Exceto no vs 2010).
Um teste rápido mostra que o VS 2010 desativa o suporte de triglá por padrão (ele imprime "'??'
"No 2º teste). No vs 2010, você deve permitir explicitamente o suporte a triglura usando o /Zc:trigraphs
opção. Agradável.
Para mais detalhes sobre o que são trigrafs, consulte: Objetivo das sequências de trigráfias em C ++?