三元运算符的不兼容性
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 规则在此处使用大括号。
#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 规则在此处使用大括号。