【问题标题】:incompatability of the ternary operator三元运算符不兼容
【发布时间】:2015-09-11 20:57:36
【问题描述】:
#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 编译器中没有这样做,任何人都可以解释一下

【问题讨论】:

  • 什么是架构,为 BIT0 定义的值是什么,a 的类型是什么?
  • 你的代码不起作用:首先,if (a = 4) 总是返回true。其次,在您的示例中, a 根本不可能是 4。第三,您没有将三元语句的结果分配给任何东西,那么它应该做什么?

标签: gcc ternary-operator operator-precedence


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    请注意,您可能希望得到与表达式 a &amp; (1 &lt;&lt; 2) != 0 不同的结果:==operator precedence&amp; 强,因此计算结果为 a &amp; ((1 &lt;&lt; 2) != 0),对于您的三元组,false运营商自4 &amp; 1 == 0

    你想要:(a &amp; (1 &lt;&lt; 2)) != 0 ? ...;a &amp; 4 ? ...;

    【讨论】:

      猜你喜欢
      • 2016-01-24
      • 2019-02-09
      • 2014-11-24
      • 2015-12-05
      • 2015-07-02
      • 2014-03-28
      • 1970-01-01
      • 2018-09-10
      相关资源
      最近更新 更多