【发布时间】:2016-02-20 12:08:04
【问题描述】:
在阅读德州仪器为其SensorTag 提供的示例代码时,我遇到了以下 sn-p。
void SensorTagIO_processCharChangeEvt(uint8_t paramID) {
...
if (!!(ioValue & IO_DATA_LED1)) {
PIN_setOutputValue(hGpioPin, Board_LED1, Board_LED_ON);
} else {
PIN_setOutputValue(hGpioPin, Board_LED1, Board_LED_OFF);
}
if (!!(ioValue & IO_DATA_LED2)) {
PIN_setOutputValue(hGpioPin, Board_LED2, Board_LED_ON);
} else {
PIN_setOutputValue(hGpioPin, Board_LED2, Board_LED_OFF);
}
if (!!((ioValue & IO_DATA_BUZZER))) {
Clock_start(buzzClockHandle);
}
...
}
声明是这样的(在同一个文件中)。
#define IO_DATA_LED1 0x01
static uint8_t ioValue;
if (!!(ioValue & IO_DATA_LED1)) 比if (ioValue & IO_DATA_LED1) 有什么优势吗?
【问题讨论】:
-
@CoolGuy:那不是骗局。链接问题中的参数转换为布尔值是有原因的。在这里它是无用的,因为值本身没有被处理。
-
@Olaf 不,
__builtin_expect(x, 0)和__builtin_expect(!!(x),0)应该表现相同,因此在那里也没用 -
当然,到目前为止,这里提供的答案都没有提供任何关于为什么
if (!!((ioValue & IO_DATA_BUZZER))) {会在按位与周围包含 double 括号的任何见解。这样的事情让我想知道我们是否只是看到遭受剪切和粘贴/搜索和替换损坏的代码。
标签: c expression