【问题标题】:Using Logical AND 1 when setting a variable in C在 C 中设置变量时使用逻辑与 1
【发布时间】:2018-12-09 00:08:16
【问题描述】:

今天在查看一些代码时,我发现了一个有趣的(不必要的?)设置变量的方法:将逻辑与添加到值。

LED_GRN = (ivLEDGrnSequence & ivLEDSlot) && 1;

我对其中的一些事件进行了更多查看,并在整个代码中找到了它们,但形式不同:

作为函数的参数:

isoAgCmdHideShow(iObjectID,( (ecu.l & sVar->mask) && 1), (uint8_t *)TxMsg.buf);

在条件句中:

if( (usbQueue.selection & USB_SELECTION_CAN_1) && 1 ) {return TRUE;}

这个额外的逻辑与实际上是否改变了代码的任何内容,还是只是多余的?我尝试在网上搜索这个,但我找到的最接近答案的是Short-Circuit Evaluation,这似乎不适用于这些情况,因为短路 1 是没有用的。

简而言之,逻辑与1对变量声明有什么作用?

【问题讨论】:

    标签: c


    【解决方案1】:

    这似乎是一种将任何非零数字强制为1,同时保持零的技巧 - 以及更常见的!!(expr) idiomatic construct

    想法是根据ivLEDGrnSequence & ivLEDSlot的值将LED_GRN设置为10

    做同样事情的其他方法如下:

    LED_GRN = !!(ivLEDGrnSequence & ivLEDSlot);
    LED_GRN = (ivLEDGrnSequence & ivLEDSlot) != 0;
    

    【讨论】:

    • 这更有意义。感谢您提供该方法的替代方案!编辑:如上所述,它在条件中有什么用处吗?
    • 另一种方式:LED_GRN = (ivLEDGrnSequence & ivLEDSlot) ? 1 : 0;
    • 或者简单地说:bool LED_GRN = ivLEDGrnSequence & ivLEDSlot
    • @EugeneSh。它应该适用于现代编译器(当然,当符合 C11 时)。 bool 或更具体地说是 _Bool 是该语言的后期添加。因此,过时的编译器在处理bool 时可能会表现出古怪的行为。
    【解决方案2】:

    执行x && 1 会产生 1 或 0,无论左操作数的计算结果是什么非零值。

    来自 C 标准:

    §6.5.13 逻辑与运算符

    如果两个操作数比较不相等,&& 运算符将产生 1 为 0;否则,它产生 0。结果的类型为 int。

    【讨论】:

      【解决方案3】:

      它将按位与的结果转换为 0 或 1。按位与的结果可以是 0 或任何非零数。但是逻辑与之后,结果只能是0或者1。

      所以前两个例子可能有用。 if 语句的第三个示例肯定没有用,因为if 将表达式转换为布尔值。

      【讨论】:

        【解决方案4】:

        逻辑运算的结果(在本例中为&&)是01。算术或按位运算(本例中为&)的结果是0 或非0。如果我们想将任何非0 转换为1,我们对其执行逻辑操作。实现这一点的更常见和惯用的方法是双重否定:

        LED_GRN = !!(ivLEDGrnSequence & ivLEDSlot);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-02-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-03
          • 2015-04-11
          • 1970-01-01
          相关资源
          最近更新 更多