Почему экранирование символа 'w' ('\ w') меняет представление в памяти переменной int? - PullRequest
5 голосов
/ 27 сентября 2011

Рассмотрим следующий пример кода:

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

Примечание: компилятор MSVS SP1 2005 C ++, просто настройки отладки / компиляции по умолчанию.машина х86.Компилятор выводит предупреждение C4129: 'w': escape-последовательность нераспознанных символов, а все остальное в порядке.

Необработанное представление памяти указанных переменных выглядит следующим образом:

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

Почему i2имеет обратный порядок?Что происходит ??

1 Ответ

4 голосов
/ 27 сентября 2011

Это ошибка в компиляторе. Я предлагаю вам сообщить об ошибке на Microsoft Connect (хотя я бы не поспорил, что они исправят ее в ближайшее время). Это также происходит с реальными escape-последовательностями, такими как \n или \x6e, поэтому не имеет ничего общего с недопустимой escape-последовательностью \w.

В VS 2008 и VS 2010 вывод этой программы:

#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;
}

это:

61626e22
61626e22
61626e22
2261626e

Это показывает, что по какой-то странной причине компилятор перемещает кавычку (22) в начало символьной константы с несколькими символами, но только тогда, когда она экранирована и когда в константе есть другой экранированный символ.

...