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

Rom*_*eno 5 c++ memory literals

请考虑以下代码示例:

int i1 = 'w\"';
int i2 = '\w\"';
int i3 = 'w"';
int i4 = 'w\"';
Run Code Online (Sandbox Code Playgroud)

注意: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
Run Code Online (Sandbox Code Playgroud)

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

Ada*_*eld 4

这是编译器中的一个错误。我建议您在Microsoft Connect上提交错误(尽管我打赌他们不会很快修复它)。它也会出现在真正的转义序列(如\nor)中\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;
}
Run Code Online (Sandbox Code Playgroud)

这是:

61626e22
61626e22
61626e22
2261626e
Run Code Online (Sandbox Code Playgroud)

这表明,出于某种奇怪的原因,编译器将引号(22)移动到多字符字符常量的开头,但仅当它被转义并且该常量中有另一个转义字符时才如此。