我只想问一个问题。
!x
和x==0
相同吗?
我用它们来测试一个条件(中断),在这种情况下,x
只是一个比特。我使用它的代码示例:
if(PIR1bits.SSPIF & !SSPCON2bits.ACKSTAT)
{
// some operation
}
为什么不做一个简单的表?
x !x x==0
0 1 1
1 0 0
因此,在您的情况下,if(!x)
或if(x==0)
的评估应该是相同的。
edit准确地说,在您的代码中,&
运算符指的是按位AND运算符,因此您的条件只能在PIR1bits.SSPIF=1
和SSPCON2bits.ACKSTAT=0
为true
正如coincoin所指出的,您可能希望您的代码读取
if(PIR1bits.SSPIF && !SSPCON2bits.ACKSTAT) {...}
因此,您使用的是逻辑"and",而不是位"and"。逐位运算符(&,|,^,~)通常用于实现要测试、设置或清除字节或字中的位的掩码。如果在If语句中使用它们,则可能会出现难以调试的怪异行为。
你可以做之类的事情
if (i & 0x80) {...}
测试是否设置了位15或类似的东西
uint16_t a, b;
a = b & 0xfff0;
清除b的下半字节并将其分配给a.