三元运算符的不兼容性

incompatability of the ternary operator

#define BIT2 (1 << 2) 
#define BIT0 (1 << 0) 

unsigned int a = 0, temp = 0;

#define setBit2_a (a |= BIT2) 
#define clearBit2_a (a &= ~BIT2)

#define setBit0_a (a |= BIT0) 
#define clearBit0_a (a &= ~BIT0)
void main()
{
    a=4; //use a scanf here for convinient
    temp = a;

    a & BIT0 != 0 ? setBit2_a : clearBit2_a;
    temp & BIT2 != 0 ? setBit0_a : clearBit0_a;        

    printf("the number entered is a = %u\n\r", a);
}

这应该在变量 a 中设置位 0,但它在 ubuntu gcc 编译器中没有这样做,任何人都可以解释一下吗

请注意,您可能期望表达式 a & (1 << 2) != 0 的结果不同:==operator precedence& 强,因此计算结果为 a & ((1 << 2) != 0) 对于你的三元运算符来说总是 false 因为 4 & 1 == 0

您想要:(a & (1 << 2)) != 0 ? ...;a & 4 ? ...;

这里需要注意的是: == 的运算符优先级比 & 强,因此评估结果始终为 false,我们需要根据优先级和 BODMAS 规则在此处使用大括号。