“|”的确切功能是什么?分离参数时的(垂直线)运算符

时间:2013-06-28 14:11:47

标签: c++ operators flags

我用过双垂直“||”作为布尔“或”运算符。并看到“|”是按位还是。

但是,由于我已经开始使用c ++ / cli,我注意到它曾经用一个似乎接受多个标志的单个参数来分隔函数中的标志。

这方面的一个例子是msdn的MessageBox()函数示例。

int msgboxID = MessageBox(
        NULL,
        (LPCWSTR)L"Resource not available\nDo you want to try again?",
        (LPCWSTR)L"Account Details",
        MB_ICONWARNING | MB_CANCELTRYCONTINUE | MB_DEFBUTTON2
    );

“|”执行的操作到底是什么这里吗?

什么是“|”实际上叫做符号? (就像“^”被称为插入符号,而不是我之前所知道的编程,这是“倒置V”):D

我问的原因是我正在使用函数setWindowPos(),它也接受标志作为参数。函数声明如下:

BOOL WINAPI SetWindowPos(
  _In_      HWND hWnd,
  _In_opt_  HWND hWndInsertAfter,
  _In_      int X,
  _In_      int Y,
  _In_      int cx,
  _In_      int cy,
  _In_      UINT uFlags
);

我想知道是否可以像在MessageBox()中那样组合标志。

提前致谢,

5 个答案:

答案 0 :(得分:5)

 unsigned int flag = MB_ICONWARNING | MB_CANCELTRYCONTINUE | MB_DEFBUTTON2

这里,|仍然是按位或运算符。它分开的论点是一些小问题的宏。它们可能是这样定义的:

#define MB_ICONWARNING       1
#define MB_CANCELTRYCONTINUE 2
#define MB_DEFBUTTON2        4

因此,在函数MessageBox内,可以像这样检查选项,以检查MB_ICONWARNING位是否打开。

if (flag & MB_ICONWARNING)

答案 1 :(得分:4)

|bitwise or运算符。它以您描述的方式使用,可以组合多个值以产生不同的效果。例如:

unsigned char MB_ICONWARNING = 1; //00000001
unsigned char MB_CANCELTRYCONTINUE = (1 << 1); //00000010
unsigned char MB_DEFBUTTON2 = (1 << 2); //00000100

假设您想要一个包含由这些值表示的所有属性的消息框,您可以通过bitwise or指定它们:

unsigned char combined = MB_ICONWARNING | MB_CANCELTRYCONTINUE | MB_DEFBUTTON2; //00000111

然后被调用函数可以使用它们来确定您使用bitwise &运算符请求的选项

if(options & MB_ICONWARNING)
{
    //Do MB_ICONWARNING 
}

if(options & MB_CANCELTRYCONTINUE)
{
    //Do MB_CANCELTRYCONTINUE
}

//etc...

如果您有兴趣,可以在Bit Fields上阅读更多内容。

答案 2 :(得分:3)

只要标志可以通过它们的位唯一标识(例如,通过2的幂),那么它们可以使用按位或运算符进行组合,因为您正在尝试这样做。

考虑:

MB_ICONWARNING = 1;
MB_CANCELTRYCONTINUE = 2;

然后

flags = MB_ICONWARNING | MB_CANCELTRYCONTINUE; // == 3

要检查标志,可以使用按位和:

if(flags & MB_ICONWARNING) { ... }

答案 3 :(得分:2)

答案 4 :(得分:1)

如果你看here所有这些错误所具有的模式(我的意思是它们的值表示),你会注意到它们有很多按位ORing它们。每组标志都保留一个4位块,根据特定标志修改该块的值。

组合的选择方式是这样,因此按位OR可以作为+运算符。

MB_ICONWARNING ...............的 0x00000030L

MB_DEFBUTTON2 ................的 0x00000100L

MB_CANCELTRYCONTINUE。的 0x00000006L

按位或结果................... 0x00000136L

由于MessageBox的第3个参数代表

  

对话框的内容和行为。

编译器现在可以轻松地根据按位结果检查要显示的内容。