2009-05-13 4 views
2

Обычно я вижу это при просмотре кода Win32 gui. Мое предположение состоит в том, что он является стандартным поразрядным или, но я также иногда вижу его на C#, и кажется, что там будет лучший (более высокий уровень) способ сделать то же самое. Во всяком случае, вот пример:Что такое | оператор в вызове функции? [C++]

MessageBox(NULL, "Window Creation Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK); 

Спасибо,

Симус

ответ

17

The | является побитовым ИЛИ. MB_OK и MB_ICONEXCLAMATION - это константы, которые имеют мощность 2 (например, 32 или 128), так что побитовое ИЛИ может их комбинировать (128 | 32 будет 160, у которого есть два бита). Это нормально, когда биты используются как флаги.

+5

Также обратите внимание, что это не относится к функциям вызовов, она ведет себя одинаково везде. –

5

Это побитовое или оператор, как в других местах. В принципе, этот метод используется, когда вы хотите установить некоторые атрибуты, которые не являются взаимоисключающими.

Функция может легко проверить их с некоторой кодой:

if (arg & MB_ICONEXCLAMATION) { // Show an exclamation icon... 

} 

// ... 

if (arg & MB_OK) { // Show an OK button 

} 
+0

Поэтому я предполагаю, что это будет использоваться для объединения флагов, таких как 0001 и 0010 в 0011, для хакерского (?) Вызова функции аргумента переменной –

+0

Это обычная техника в Windows API. Да, это верно. –

+0

Его общая техника во многих местах, включая * nix системные вызовы. Посмотрите, например, на режимы и флаги open(). Использование длинного параметра для передачи коллекции из 32 флагов для управления деталями API - это эффективное использование стека, не говоря уже о том, чтобы сделать тон от пространства пользователя до системного пространства, необходимого для более простого управления системным вызовом, чем многие из более сложные способы, которые вы могли бы себе представить. – RBerteig

0

Это делает побитовое или.

int x = 5 | 3; // x == 7

+0

Нет, двоичный код для 5 равен 101, а двоичный для 3 равен 011, поэтому 5 | 3 является двоичным 111 или 7. –

+0

Я думаю, вам нужно проверить свою математику. 5 | 3 равно 7. (101) _2 | (011) _2 = (111) _2 – Welbog

+1

Ahh бинарная голова болит .... –

12

Его для битовой маскировки. Позволяет использовать этот невероятно простой пример. У вас есть двоичное значение для цветов со следующими значениями.

100 = СИНИЙ

010 = RED

001 = GREEN

Когда вы говорите SomeFunction (BLUE | RED | ЗЕЛЕНЫЙ); вы infact передаете значение 111, которое затем может быть декодировано для обозначения BLUE и RED и GREEN.

Побитовые операторы Google для более подробной информации.

+0

Большое спасибо, я думаю, если бы я дал ему еще несколько размышлений, я бы понял, что это все, что он делает. Но мне никогда не мешает спросить, я полагаю, особенно при переполнении стека. Благодаря! –

+1

Нет проблем. Лучше спросить и научиться, чем остаться и не учиться. Это одна из тех вещей, которые все разбросаны по всем Win32 и MFC, но пока вы не остановитесь и не подумайте о том, как это работает, это может также стать волшебством. :) – Serapth

+0

Действительно ли это «маскировка»? Я связываю & с «маскировкой», как в «применении бинарной маски». – unwind

2

Подумайте о MB_ICONEXCLAMATION и MB_OK как «опции», которые не являются чем-то более привлекательным, чем ints. Что вам нужно, так это битовое представление этих ints.

Скажи:

//MessageBox.cs or whatever 
public static int MB_ICONEXCLAMATION = 0x1 // 0001 in binary 
public static int MB_OK = 0x2 // 0010 in binary 

Когда вы или их вместе, вы получите 0011 в двоичной системе. Таким образом, вы запрашиваете оба варианта для MessageBox, используя только один аргумент вместо того, чтобы иметь больше аргументов, по одному для каждого параметра, который вы хотите указать.