c - 使用 if (!!(expr)) 而不是 if (expr)

标签 c expression

在阅读德州仪器为其 SensorTag 提供的示例代码时我发现了以下代码段。

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) 有任何优势?

最佳答案

两次应用逻辑非 (!) 运算符的目的是将值规范化为 0 或 1。在 if 语句的控制表达式中,这没有任何区别. if 语句只关心值是零还是非零,小小的 !! 舞蹈完全没用。

一些编码风格指南可能会强制执行这种舞蹈,这可能就是您发布的 TI 代码这样做的原因。不过,我还没有看到这样做。

关于c - 使用 if (!!(expr)) 而不是 if (expr),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35523023/

相关文章:

c++ - 除了使用表达式之外,我可以访问 C++ 中的对象吗?

objective-c - 如何在 macOS 上以编程方式将文件和文件夹移动到垃圾箱?

c - 在进程之间传递值

c++ - if 语句表达式调用函数,需要测试是否为真

c - 使用 C 中的表达式树计算后缀表达式

c# - 使用自定义运算符组合 Lambda 表达式

sql - 用反斜杠分隔字符串 SQL/SSIS

c - 如何使用Fuse文件系统进行转换?

c - 将变量标记为 "done for"

c - C 中的空指针分配错误、代码中的段错误错误