具有常数问题的按位运算

时间:2016-11-24 21:54:01

标签: visual-studio c++-cli constants bitwise-operators

这是我遇到的最奇怪的事情之一。我的问题是:

首先,我在Windows 7上使用Visual Studio 2015.在C ++ \ CLI项目中,我的代码类似于以下内容:

void Class::function(int flag) 
{
   if ((flag & CONST) != 0)
       printf("Passed.");
   else 
       printf("Failed.");
}

其中CONST在另一个(非CLR)DLL中定义为0x111。看起来很直截了当。我遇到的问题是当我进入flag等于0x40的程序时。对我来说,看起来这个程序应该打印Failed.,而事实上它打印Passed.。我做的下一件事是将我的代码改为:

void Class::function(int flag) 
{
   int local = CONST, localRes = flag & local, res;
   if ((res = (flag & CONST)) != 0)
       printf("Passed.");
   else 
       printf("Failed.");
}

现在,打破printf上的执行,我在Watch中获得了以下值:

res = 0x110
local = 0x111
localRes = 0x0

我无法看到CONST的价值,尽管VS在这种情况下并不知道它。

就我而言,我可以使用local来解决这个问题,但我宁愿理解它。有人可以告诉我编译/执行有什么问题吗? 谢谢!

编辑:在包含的头文件(包含为extern "C")中,定义如下:

#define CONST /
   C1 | C2 | C3

经常出现C10x1C20x10C30x100

1 个答案:

答案 0 :(得分:0)

flag & CONST扩展为flag & C1 | C2 | C3,相当于(flag & C1) | C2 | C3

不要#define没有括号的表达式,或者运算符优先级会咬你。

如果您无法控制标题,请将其包装在您自己的宏中:

#define GOOD_CONST (CONST)

或者将其放在变量中(如果需要在标题中公开,请使用extern):

unsigned int GOOD_CONST = CONST;

仅在代码中使用它。