指针算术视觉工作室C
Pointer arithmetic Visual Studio C++
考虑以下两个无用的C 功能。
用GCC编译(4.9.2,32-或64位(两个功能都返回与预期相同的值。
与Visual Studio 2010或Visual Studio 2017(非托管代码(一起编译的两个功能都返回不同的值。
我尝试了什么:
- 支架,支架,支架
- 明确的演员表
- sizeof(char(被评估为1
- 调试/发行版本
- 32-/64-bit
这里发生了什么?这似乎是vs。
char test1()
{
char buf[] = "The quick brown fox...", *pbuf = buf;
char value = (*(pbuf++) & 0x0F) | (*(pbuf++) & 0xF0);
return value;
}
char test2()
{
char buf[] = "The quick brown fox...", *pbuf = buf;
char a = *(pbuf++) & 0x0F;
char b = *(pbuf++) & 0xF0;
char value = a | b;
return value;
}
编辑:
- 这不是责备vs的尝试(如帖子中提到(。
- 这不是签名或未签名的问题。
- 这不是操作员左右评估顺序的问题。更改test2((中A和B分配的顺序会产生第三个结果。
- 但同时性是一个好点。似乎评估的顺序被定义为未定义。在第一步中,生成的代码评估了test1((中的完整表达式,而无需增加任何指针。在第二步中,指针将被递增。由于增量没有效果,并且在此特定操作之后数据保持不变,因此优化器将删除代码。
对不起,对不起,但这不是我期望的。没有语言。
为了完整性,在这里拆卸test1((的拆卸代码:
0028102A mov ecx,dword ptr [ebp-8]
0028102D movsx edx,byte ptr [ecx]
00281030 and edx,0Fh
00281033 mov eax,dword ptr [ebp-8]
00281036 movsx ecx,byte ptr [eax]
00281039 and ecx,0F0h
0028103F or edx,ecx
00281041 mov byte ptr [ebp-1],dl
00281044 mov edx,dword ptr [ebp-8]
00281047 add edx,1
0028104A mov dword ptr [ebp-8],edx
0028104D mov eax,dword ptr [ebp-8]
00281050 add eax,1
00281053 mov dword ptr [ebp-8],eax
(*(pbuf++) & 0x0F) | (*(pbuf++) & 0xF0);
的行为是不确定的。|
(与||
不同(是不是一个测序点,因此您在同一程序步骤中同时读取和写入pbuf
。
因此不是与错误。(这样的事情很少是:黄金法则不应该责怪编译器。(
(还请注意char
可以是signed
或unsigned
。可以引入像您一样的代码差异。(
相关文章:
- 视觉工作室项目.提取源文件夹名称
- 为什么我在尝试模板时遇到视觉工作室C++错误
- 视觉工作室 2017;启用 /permissive 时,类型 "const wchar_t *" 的参数与类型 "PWSTR" 的参数不兼容
- remove(str.begin(), str.end(), );无法正常工作(我正在使用视觉工作室 2012)
- 背包问题,视觉工作室问题
- 如果变量数据包含大于 vector 所有元素的整数,则仅在视觉工作室上接收"矢量下标超出范围"?
- C++ 调试断言失败 - 矢量下标超出视觉工作室的范围
- 在turbo c++中编译.不在视觉工作室
- 将库文件夹添加到视觉工作室
- 在视觉工作室中以十六进制进行位移位并通过 cout 输出
- 我正在尝试在视觉工作室上创建自己的库/源函数
- 我在视觉工作室中制作了一个类似胭脂的游戏,我想显示玩家的生命值
- 在 UWP 视觉工作室项目中包括外部文件夹
- 视觉工作室未显示符号表?
- 如何在视觉工作室社区中设置竞争性编程站点等环境?
- 无法在视觉工作室社区 2015 中加载项目
- 合成错误不知道为什么会发生这种情况,请检查一下并告诉我这是我的编码还是视觉工作室
- 使用QT Connect时,视觉工作室警告
- 执行视觉工作室异常处理模式
- 在不同的计算机上运行.exe文件.(视觉工作室)