小编Qyl*_*yle的帖子

指针算术Visual Studio C++

考虑以下两个无用的C++函数.

使用GCC(4.9.2,32或64位)编译时,两个函数都返回与预期相同的值.

使用Visual Studio 2010或Visual Studio 2017(非托管代码)编译,两个函数都返回不同的值.

我尝试过的:

  • 括号,括号,括号
  • 显式转换为char
  • sizeof(char)被评估为1
  • 调试/发布版本
  • 32/64位

这里发生了什么?这似乎是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;
}
Run Code Online (Sandbox Code Playgroud)

编辑:

  • 这不是企图责怪VS(如帖子中所述).
  • 这不是签名或未签名的问题.
  • 这不是OR运算符左侧和右侧的评估顺序问题.更改test2()中a和b的赋值顺序会产生第三个结果.
  • 但同时性是一个好点.似乎评估的顺序定义为未定义.在第一步中,生成的代码在不增加任何指针的情况下评估test1()中的完整表达式.在第二步中,指针将递增.由于增量无效并且在此特定操作后数据保持不变,优化程序将删除代码. …

c++ bitwise-operators pointer-arithmetic

1
推荐指数
1
解决办法
147
查看次数