'??' está siendo convertida en '^' en Visual C ++. Por qué está sucediendo y lo que es la salida?
-
27-09-2019 - |
Pregunta
'??' se convierte en '^' si el programa de compilación mn VC ++ y ejecutarlo
por ejemplo.
sprintf( ch, "??")
imprime
^
Pero si corro el mismo código en Turbo C / C ++, no hay tal problema. Por qué está sucediendo en VC ++ en Windows?
Solución
??
solo no es un trigraph , aunque ??'
corresponde a ^
.
Tal vez las ha escrito aquí diferente de lo que se tiene en el código y no se puede ver la comilla simple arrastrando en su cadena porque es demasiado cerca de la cotización de cierre.
Así que en código es probable que tenga:
sprintf( ch, "??'");
Otros consejos
¿está seguro de que era una doble cita y no una comilla simple? Si era ??', entonces has encontrado con un solo trigraph , que es un " característica" que realmente debe ser eliminado, pero no se debe a IBM no migrar a UTF-8 de EBCDIC . (Tri-grafos se consideraron para la eliminación cuando C ++ 0x todavía estaba abierta para los cambios, pero el movimiento para conseguir trigrafos retirados fueron vehementemente bloqueados por IBM y sus representantes en comité de la ISO C ++).
El ??
generalmente secuencia comienza un trigraph, pero la secuencia "??" No es un trigraph por lo que no debe interpretarse como tal - tal vez hay un error en el compilador - exactamente qué versión está usando, y lo que es el código exacto (incluyendo las declaraciones de variables)
Este código imprime "??" en varias versiones de MSVC 6 a VS 2010 como se podría esperar:
char ch[20];
sprintf( ch, "??");
printf( "%s\n", ch);
Pero sustituir el snprintf()
line con:
sprintf( ch, "'??'");
y la salida se convierte en "'^
" (excepto en VS 2010).
Una prueba rápida muestra que el apoyo VS 2010 desactiva trigraph por defecto (se imprime "'??'
" en la segunda prueba). En VS 2010 tiene que habilitar explícitamente el apoyo trigraph usando la opción /Zc:trigraphs
. Niza.
Para más detalles sobre lo que se trigrafos, ver: de secuencias trigraph en C ++?