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

标签 c++ operators flags

<分区>

我用了双竖“||”作为 bool “或”运算符。并看到“|”是按位或。

但是,自从我开始使用 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() 中那样组合。

提前致谢

家伙

最佳答案

|按位或 运算符。它以您描述何时可以组合多个值以产生不同效果的方式使用。例如:

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

假设您想要一个消息框,它具有由这些值表示的所有属性,您可以通过按位或'ing它们来指定:

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

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

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

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

//etc...

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

关于c++ - 分隔参数时 "|"(垂直线)运算符的确切功能是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17366703/

相关文章:

c++ - 多个命名空间的命名冲突?

c++ - QWizard::addPage() 上的 "QObject::connect: Attempt to bind non-signal Class::signal"警告

javascript - 用javascript中的变量替换运算符

go - Go 的 os.OpenFile 标志参数中管道字符的用途是什么?

shell - zsh 可以完成命令标志吗?

c++ - 表达式将如何存储在堆栈中?

C++ const 在函数声明和其他任何地方的 & 符号的右边

c++ - 如何编写返回对单个位的引用的 bool& operator[](int index)

c++ - 在 C++ 中继承友元运算符

pointers - Golang 指向值的指针字符串