为什么转义'w'('\ w')字符会反转int变量的内存表示?

时间:2011-09-26 21:38:42

标签: c++ memory literals

请考虑以下代码示例:

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

注意:MSVS SP1 2005 C ++编译器,只是默认的调试编译/链接设置。 x86机器。编译器输出警告C4129:'w':无法识别的字符转义序列,其他一切都很好。

给定变量的原始内存表示如下:

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

为什么i2有逆序?怎么回事?

1 个答案:

答案 0 :(得分:4)

这是编译器中的一个错误。我建议你在Microsoft Connect上提交一个错误(虽然我不会打赌他们很快就会修复它)。它也会出现真实的转义序列,例如\n\x6e,因此它与无效的转义序列\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)移动到多字符字符常量的开头,但只有当它被转义并且常量中还有另一个转义字符时才会移动。