2014-02-08 2 views
2

Что делает | = Среднее значение в C++? Я нашел этот фрагмент кода в сети:Что означает | = среднее

DWORD CDirWatcherDlg::GetChangeFlags1() 
{ 

    DWORD dwChangeNotifyFlags = 0UL; 
    FLAG_INFO arFlagInfo[]={ 
     {IDC_CHECK_FILE_NAME1,  FILE_NOTIFY_CHANGE_FILE_NAME}, 
     {IDC_CHECK_DIR_NAME1,  FILE_NOTIFY_CHANGE_DIR_NAME}, 
     {IDC_CHECK_LAST_WRITE1,  FILE_NOTIFY_CHANGE_LAST_WRITE}, 
     {IDC_CHECK_LAST_ACCESS1, FILE_NOTIFY_CHANGE_LAST_ACCESS}, 
     {IDC_CHECK_SIZE1,   FILE_NOTIFY_CHANGE_SIZE}, 
     {IDC_CHECK_ATTRIBUTES1,  FILE_NOTIFY_CHANGE_ATTRIBUTES}, 
     {IDC_CHECK_LAST_WRITE1,  FILE_NOTIFY_CHANGE_LAST_WRITE}, 
     {IDC_CHECK_LAST_ACCESS1, FILE_NOTIFY_CHANGE_LAST_ACCESS}, 
     {IDC_CHECK_CREATION1,  FILE_NOTIFY_CHANGE_CREATION}, 
     {IDC_CHECK_SECURITY1,  FILE_NOTIFY_CHANGE_SECURITY} 
    }; 

    for(int i = 0; i < sizeof(arFlagInfo)/sizeof(arFlagInfo[0]); ++i) 
    { 
     dwChangeNotifyFlags |= (IsDlgButtonChecked(arFlagInfo[i].nCtrlId) == BST_CHECKED)? arFlagInfo[i].nFlag : 0; 
    } 

    return dwChangeNotifyFlags; 
} 

И я не могу понять, что это за функция.

Может кто-нибудь объяснить это, пожалуйста?

+4

'| =' это то же самое, что и '' 'как' + = 'на' + '. – bereal

+2

не могли бы вы объяснить полный код цикла, пожалуйста? –

+1

http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B – nico

ответ

3

Это означает "bitwise OR", он также используется в C, и работает так же, как +=

Скажем, например, что мы имеем следующий код:

char o = 0xF0; 
o |= 0x0F;  //You can also write o = o|0x0F; 

Теперь o имеет значение 0xFF :

1111 0000 | 0000 1111 = 1111 1111 

Давайте попробуем еще раз:

char o = 0xE1; //1110 0001 
o |= 0x08;  //0000 1000 

И o сейчас:

1110 0001 | 0000 1000 = 1110 1001 

Что 0xE9

0

Это оператор побитовое ИЛИ задание.

int a, int b; 
// assign some values to a and b 
a |= b; 

эквивалентно

a = (a | b); 

Смотрите here для получения дополнительной информации о побитовых операторов в C++.

В коде

dwChangeNotifyFlags |= (IsDlgButtonChecked(arFlagInfo[i].nCtrlId) == BST_CHECKED)? arFlagInfo[i].nFlag : 0; 

означает, что dwChangeNotifyFlags является OR-нут с arFlagInfo[i].nFlag если IsDlgButtonChecked(arFlagInfo[i].nCtrlId) == BST_CHECKED верно, а результат присваивается dwChangeNotifyFlags. В противном случае dwChangeNotifyFlags остается неизменным (поскольку он равен OR'd с 0).

+1

Нет, это произойдет, если он использует побитовый оператор присваивания AND. –

+1

@maja OR-ing что-то с 0 оставляет его неизменным. – user4815162342

Смежные вопросы