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

Guy*_*ean 1 c++ flags operators

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

但是,由于我已经开始使用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
    );
Run Code Online (Sandbox Code Playgroud)

"|"执行的操作到底是什么 这里?

什么是"|" 实际上叫做符号?(就像"^"被称为插入符号,而不是我在编程之前所知道的,这是"倒置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
);
Run Code Online (Sandbox Code Playgroud)

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

提前致谢,

家伙

Ant*_*ois 6

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

unsigned char MB_ICONWARNING = 1; //00000001
unsigned char MB_CANCELTRYCONTINUE = (1 << 1); //00000010
unsigned char MB_DEFBUTTON2 = (1 << 2); //00000100
Run Code Online (Sandbox Code Playgroud)

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

unsigned char combined = MB_ICONWARNING | MB_CANCELTRYCONTINUE | MB_DEFBUTTON2; //00000111
Run Code Online (Sandbox Code Playgroud)

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

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

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

//etc...
Run Code Online (Sandbox Code Playgroud)

如果您有兴趣,可以阅读有关位字段的更多信息。


Yu *_*Hao 5

 unsigned int flag = MB_ICONWARNING | MB_CANCELTRYCONTINUE | MB_DEFBUTTON2
Run Code Online (Sandbox Code Playgroud)

在这里,|仍然是按位或运算符.它分开的论点是一些点模式的宏.它们可能定义如下:

#define MB_ICONWARNING       1
#define MB_CANCELTRYCONTINUE 2
#define MB_DEFBUTTON2        4
Run Code Online (Sandbox Code Playgroud)

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

if (flag & MB_ICONWARNING)
Run Code Online (Sandbox Code Playgroud)