今天在阅读一些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块中的代码(如果存在)。
它掩码(执行二进制AND操作)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