2015-10-06 83 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

它掩码(执行二进制AND操作)dwEventEV_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 */}