分隔参数时"|"(垂直线)运算符的确切功能是什么



我使用了双竖线"||"作为布尔运算符"or"。并且看到"|"是位或。

然而,自从我开始使用c++/cli以来,我注意到它曾经用一个似乎接受多个标志的参数来分隔函数中的标志。

msdn的MessageBox()函数示例就是一个例子。

int msgboxID = MessageBox(
        NULL,
        (LPCWSTR)L"Resource not availablenDo 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()中那样组合。

提前感谢

Guy

|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...

如果你感兴趣,你可以在比特字段上阅读更多。

 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)

只要标志可以通过其位唯一识别(例如,通过二的幂),那么它们就可以像您尝试的那样使用位或运算符进行组合。

考虑:

MB_ICONWARNING = 1;
MB_CANCELTRYCONTINUE = 2;

然后

flags = MB_ICONWARNING | MB_CANCELTRYCONTINUE; // == 3

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

if(flags & MB_ICONWARNING) { ... }

符号被称为以下符号之一:竖线、vbar、竖线或垂直斜线:

http://www.theasciicode.com.ar/ascii-printable-characters/vertical-bar-vbar-vertical-line-vertical-slash-ascii-code-124.html

它执行按位OR:

http://en.wikipedia.org/wiki/Bitwise_operation

如果您在这里查看所有这些错误的模式(我指的是它们的值表示),您会注意到有很多对它们进行逐位"或"运算的感觉。每组标志都保留一个4位块,根据特定标志修改该块的值。

以这种方式选择组合,使得按位OR可以作为+运算符工作。

MB_icon警告0x00000030L

MB_DEFBUTTON2…………..0x00000100L

MB_CANCELTRYCONTINUE0x00000006L

逐位OR结果0x00000136L

作为MessageBox的第三个参数,代表

对话框的内容和行为。

编译器现在可以很容易地根据逐位结果检查要显示的内容。

最新更新