Пришел через странную нотацию сегодня при чтении кода C Может ли кто-нибудь объяснить мне, что делает линия?Смысл одиночного & в выражении if
if ((dwEvent & EV_RXCHAR) && cs.cbInQue) { /* do stuff */}
Пришел через странную нотацию сегодня при чтении кода C Может ли кто-нибудь объяснить мне, что делает линия?Смысл одиночного & в выражении if
if ((dwEvent & EV_RXCHAR) && cs.cbInQue) { /* do stuff */}
Это побитовая операция. Вы можете прочитать это здесь. link
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 выполняется, если присутствует.
It маски (двоичное выполняет операцию И) dwEvent
с EV_RXCHAR
, проверяет, если результат не равен нулю, проверяет, является ли cs.cbInQue
не равно нулю, если оба являются истинными, выполняет код в условном операторе.
Это не обязательно «странное» обозначение. Многие программисты используют его как ярлык вместо указания (x & y) != 0
.
Его короткая форма, чтобы проверить, установлен ли какой-либо бит EV_RXCHAR, сначала проверив эти биты (dwEvent & EV_RXCHAR). Затем, если какое-либо из них установлено, также проверит, установлен ли также cs.cbInQue, затем выполните материал. например:
unsigned int x = dwEvent & EV_RXCHAR;
if (x !=0)
if (cs.cbInQue != 0)
{ /* do stuff */}
Он скрывает '' dwEvent' с EV_RXCHAR', проверяет, является ли оно не равно нулю, проверяет, если 'cs.cbInQue' ненулевая, если оба истинны, выполняет код в условном операторе. – owacoder
& является побитовым и оператором C. –
Сторона примечания - выражение с символом & должно быть в скобках, потому что C/C++ имеет плохой приоритет для двоичных операторов, которые должны иметь тот же приоритет, что и умножить на & и добавить/вычесть для ^. Позднее K & R отметила, что это было неправильно, но не хотел исправлять его, поскольку он может сломать существующий код. Без круглых скобок, & (двоичный и) будет оцениваться после EV_RXCHAR && cs.cbInQue (логический и), что не имеет смысла. – rcgldr