2015-10-06 2 views
-1

Пришел через странную нотацию сегодня при чтении кода C Может ли кто-нибудь объяснить мне, что делает линия?Смысл одиночного & в выражении if

if ((dwEvent & EV_RXCHAR) && cs.cbInQue) { /* do stuff */} 
+3

Он скрывает '' dwEvent' с EV_RXCHAR', проверяет, является ли оно не равно нулю, проверяет, если 'cs.cbInQue' ненулевая, если оба истинны, выполняет код в условном операторе. – owacoder

+1

& является побитовым и оператором C. –

+0

Сторона примечания - выражение с символом & должно быть в скобках, потому что C/C++ имеет плохой приоритет для двоичных операторов, которые должны иметь тот же приоритет, что и умножить на & и добавить/вычесть для ^. Позднее K & R отметила, что это было неправильно, но не хотел исправлять его, поскольку он может сломать существующий код. Без круглых скобок, & (двоичный и) будет оцениваться после EV_RXCHAR && cs.cbInQue (логический и), что не имеет смысла. – rcgldr

ответ

1

Это побитовая операция. Вы можете прочитать это здесь. link

3
if ((dwEvent & EV_RXCHAR) && cs.cbInQue) { /* do stuff */} 

& is Binary And Operator. & применяются к каждому биту оба переменных .Это проверок,

если результат dwEvent & EV_RXCHAR является non-zero того cs.cbInQue проверяется, если она non-zero или нет. Если оба условия являются истинным кодом, если выполняется блок.

Если результат dwEvent & EV_RXCHAR равен нулю, то без проверки cs.cbInQue, код в блоке else выполняется, если присутствует.

2

It маски (двоичное выполняет операцию И) dwEvent с EV_RXCHAR, проверяет, если результат не равен нулю, проверяет, является ли cs.cbInQue не равно нулю, если оба являются истинными, выполняет код в условном операторе.

Это не обязательно «странное» обозначение. Многие программисты используют его как ярлык вместо указания (x & y) != 0.

0

Его короткая форма, чтобы проверить, установлен ли какой-либо бит EV_RXCHAR, сначала проверив эти биты (dwEvent & EV_RXCHAR). Затем, если какое-либо из них установлено, также проверит, установлен ли также cs.cbInQue, затем выполните материал. например:

unsigned int x = dwEvent & EV_RXCHAR; 
if (x !=0) 
    if (cs.cbInQue != 0) 
     { /* do stuff */} 
Смежные вопросы