2

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

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

提前致谢,

盖伊

4

5 回答 5

6

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

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

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

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的内容。

于 2013-06-28T14:22:22.490 回答
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)
于 2013-06-28T14:15:51.793 回答
3

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

考虑:

MB_ICONWARNING = 1;
MB_CANCELTRYCONTINUE = 2;

然后

flags = MB_ICONWARNING | MB_CANCELTRYCONTINUE; // == 3

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

if(flags & MB_ICONWARNING) { ... }
于 2013-06-28T14:16:26.640 回答
2

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

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

它执行按位或:

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

于 2013-06-28T14:18:06.693 回答
1

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

以这种方式选择组合,因此按位 OR 可以用作+运算符。

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

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

MB_CANCELTRYCONTINUE。0x00000006L

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

作为MessageBox代表的第三个参数

对话框的内容和行为。

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

于 2013-06-28T14:18:33.600 回答