在C语言中设置变量时,使用逻辑运算符AND 1。

6

今天查看代码时,我发现了一种有趣(但可能不必要)的设置变量的方法:将逻辑 AND 添加到值中。

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;}

这个额外的逻辑与操作符实际上是否对代码产生了影响,还是只是多余的?我尝试在网上搜索过这个问题,但最接近答案的是 短路求值 这篇文章,但它似乎不适用于这种情况,因为对1进行短路求值是无用的。

简单来说,逻辑与 1 对变量声明有什么作用?

4个回答

7

这似乎是一种把任何非零数字强制转换为 1,同时保留零 - 与更常见的!!(expr)惯用结构并列使用的技巧。

其思路是根据 ivLEDGrnSequence & ivLEDSlot 的值将 LED_GRN 设置为 10

实现同样效果的其他方法如下:

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

这样更有意义。感谢提供那种方法的替代方案!编辑:在上述条件下,它有什么用处吗? - StephenKercher
另一种方式:LED_GRN = (ivLEDGrnSequence&ivLEDSlot)?1:0; - Jim Rhodes
或者简单地说:bool LED_GRN = ivLEDGrnSequence&ivLEDSlot - user3386109
1
@EugeneSh。它应该在现代编译器上运行(当然符合C11时)。bool或更具体地说是_Bool是语言的后期添加。因此,过时的编译器在处理bool时可能会显示奇怪的行为。 - user3386109

4

x && 1 的结果为 1 或者 0,不管左操作数的非零值是多少。

下面是来自 C 标准的说明:

§6.5.13 逻辑 AND 运算符

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


3
逻辑运算(在本例中是“&&”)的结果要么为“0”,要么为“1”。而算术或位运算(在本例中是“&”)的结果则为“0”或非“0”。如果我们想将任何非“0”的值转换为“1”,我们可以对其执行逻辑运算。更常见和惯用的方法是双重否定:
LED_GRN = !!(ivLEDGrnSequence & ivLEDSlot);

3

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

所以前两个例子可能有用。第三个带有if语句的例子绝对没有用处,因为if会把表达式转换为布尔值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接