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有逆序?这是怎么回事??
这是编译器中的一个错误。我建议您在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)移动到多字符字符常量的开头,但仅当它被转义并且该常量中有另一个转义字符时才如此。
| 归档时间: |
|
| 查看次数: |
179 次 |
| 最近记录: |