请考虑以下代码示例:
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有逆序?怎么回事?
答案 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)移动到多字符字符常量的开头,但只有当它被转义并且常量中还有另一个转义字符时才会移动。