C++ 为什么要逃避';w';(';\w';)字符反转int变量的内存表示形式?

C++ 为什么要逃避';w';(';\w';)字符反转int变量的内存表示形式?,c++,memory,literals,C++,Memory,Literals,考虑以下代码示例: int i1 = 'w\"'; int i2 = '\w\"'; int i3 = 'w"'; int i4 = 'w\"'; 注:MSVSP1 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

考虑以下代码示例:

int i1 = 'w\"';
int i2 = '\w\"';
int i3 = 'w"';
int i4 = 'w\"';
注:MSVSP1 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的顺序相反?发生了什么事???

这是编译器中的一个错误。我建议您在上提交一个bug(尽管我不会打赌他们会很快修复它)。它也发生在真正的转义序列中,例如
\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;
}

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

Post bug to connect.microsoft.com。不过,你可能很难被认真对待。很有意思。VS2010也做了同样的事情。我看不出有什么理由油嘴滑舌。。。这是一个bug,编译器应该在这种情况下忽略反斜杠[由MS定义;标准将行为留给实现]。它不会延迟下一个版本或任何事情,但不是所有的bug报告都可以成为交易破坏者。@Hans,在你知道它是bug之前,没有理由提交bug。了解这一点的最好方法是询问社区。我见过很多标准一致性行为,乍一看就像一个bug。@Mark-只是我的一点贡献,是的,它是一个bug。大家似乎都同意。当字符串包含无效转义时,微软是否认为需要采取合理措施完全取决于他们。
61626e22
61626e22
61626e22
2261626e