2011-09-26 8 views
5

Si consideri il seguente esempio di codice:Perché l'escape del carattere 'w' (' w') inverte la rappresentazione della memoria di una variabile int?

int i1 = 'w\"'; 
int i2 = '\w\"'; 
int i3 = 'w"'; 
int i4 = 'w\"'; 

Nota: MSVS SP1 impostazioni 2005, C++ compiler, compilation debug solo default/linkage. macchina x86. Il compilatore emette un avviso C4129: "w": sequenza di escape caratteri non riconosciuta e tutto il resto va bene.

La rappresentazione della memoria grezza delle variabili indicate sono i seguenti:

i1 -> 22 77 00 00 
i2 -> 77 22 00 00 
i3 -> 22 77 00 00 
i4 -> 22 77 00 00 

Perché i2 ha senso inverso? Cosa sta succedendo??

+0

Invia bug a connect.microsoft.com. Tuttavia potresti avere qualche problema a prenderti sul serio. –

+1

Interessante. E VS 2010 fa la stessa cosa. –

+0

Non vedo alcun motivo per essere disinvolto ... È * un * bug, il compilatore dovrebbe ignorare il backslash in quella situazione [come definito da MS; lo standard lascia il comportamento all'implementazione]. Non ritarderà la prossima release o altro, ma non tutte le segnalazioni di bug possono essere interrotte. –

risposta

4

È un errore nel compilatore. Vi suggerisco di inserire un bug su Microsoft Connect (anche se non scommetterei su di loro risolverlo in qualunque momento presto). Si verifica anche con sequenze di escape reali come \n o \x6e, quindi non ha nulla a che fare con la sequenza di escape non valida \w.

In VS 2008 e VS 2010, l'output di questo programma:

#include <stdio.h> 

int main(void) 
{ 
    int x[] = {'abn"', 'abn\"', 'ab\x6e"', 'ab\x6e\"'}; 
    for (int i = 0; i < sizeof(x)/sizeof(x[0]); i++) 
     printf("%08x\n", x[i]); 

    return 0; 
} 

è questo:

61626e22 
61626e22 
61626e22 
2261626e 

Questo dimostra che per qualche strana ragione, il compilatore sposta il virgolette (la 22) all'inizio della costante di carattere multicharacter, ma solo quando è sfuggito e quando la costante ha un altro carattere di escape in esso.